2012-12-17 44 views
6

全部。我有一个小编码问题,我希望你能帮助我。我正在为我的工作制定秒表计时器。我的老板想为公司制定一个计划,以帮助跟踪员工分配任务的时间。我被告知我应该使用asp.net,我从来没有使用过。我设法让定时器在一定程度上工作,除了保存会话外,它完成了它应有的一切。我需要做的最后一件事是如果用户关闭窗口或重新加载页面,可以让计时器仍然打勾。我认为最好的方法是使用cookies。视图状态本身工作正常,除了在重新加载时不保存定时器值。如果我在选项卡中打开一个新页面,它会启动一切。我发现如何制作饼干,但我不相信我正确地使用它们。如果有人能帮我弄清楚这个问题,我将不胜感激。如何获取cookie以使用asp.net web应用程序?

这是ASPX代码(我有一些JavaScript在那里,因为我想看到有关实现定时器的方式,使其更加准确所以,请忽略):

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="NerdcoreTimer._Default" %> 

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
<script type="text/javascript"> 
    var seconds = 0; 
    var minutes = 0; 
    var hours = 0; 
    var tick; 

    function stopCount() { 
    clearTimeout(t); 
    } 

function startCount() { 
    document.getElementById('seconds').innerHTML = seconds; 
    document.getElementById('minutes').innerHTML = minutes; 
    document.getElementById('hours').innerHTML = hours; 
    seconds = seconds + 1; 
    if (seconds == 60) { 
     seconds = 0; 
     minutes = minutes + 1; 
    } 
    if (minutes == 60) { 
     minutes = 0; 
     hours = hours + 1; 
    } 
    tick = setTimeout("startCount()", 1000) 
} 

function reset() { 
    seconds = 0; 
    minutes = 0; 
    hours = 0; 
    document.getElementById('seconds').innerHTML = seconds; 
    document.getElementById('minutes').innerHTML = minutes; 
    document.getElementById('hours').innerHTML = hours; 
} 

function startTimer() { return $find('Timer1')._startTimer(); } 
function stopTimer() { return $find('Timer1')._stopTimer(); } 
</script> 

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 

<div> 
    <table align="center"> 
     <tr> 
      <td> 
       <asp:DropDownList ID="Tasks" runat="server" Width="75px"> 
        <asp:ListItem>Task 1</asp:ListItem> 
        <asp:ListItem>Task 2</asp:ListItem> 
        <asp:ListItem>Task 3</asp:ListItem> 
        <asp:ListItem>Task 4</asp:ListItem> 
        <asp:ListItem>Task 5</asp:ListItem> 
        <asp:ListItem>Task 6</asp:ListItem> 
       </asp:DropDownList> 
      </td> 
      <td style="text-align:center"> 
       <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
        <ContentTemplate> 
         <asp:Timer ID="Timer1" runat="server" Enabled="false" Interval="879" OnTick="Timer1_Tick"></asp:Timer> 
         <asp:Label ID="hour2" runat="server" Text="0"></asp:Label> 
         <asp:Label ID="hour1" runat="server" Text="0"></asp:Label> 
         <asp:Label ID="colon1" runat="server" Text=":"></asp:Label> 
         <asp:Label ID="min2" runat="server" Text="0"></asp:Label> 
         <asp:Label ID="min1" runat="server" Text="0"></asp:Label> 
         <asp:Label ID="colon2" runat="server" Text=":"></asp:Label> 
         <asp:Label ID="sec2" runat="server" Text="0"></asp:Label> 
         <asp:Label ID="sec1" runat="server" Text="0"></asp:Label> 
        </ContentTemplate> 
       </asp:UpdatePanel> 
      </td> 
      <td> 
       <asp:Button ID="Start" runat="server" OnClientClick="startTimer()" Text="Start" Width="75px" OnClick="Start_Click" /> 
      </td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td> 
       <asp:Button ID="Stop" runat="server" OnClientClick="stopTimer()" Text="Stop" Width="75px" OnClick="Stop_Click" /> 
       <asp:Button ID="Reset" runat="server" Text="Reset" Width="75px" OnClick="Reset_Click" /> 
      </td> 
     </tr> 
    </table> 
</div> 
&nbsp 
<div> 
    <table align="center"> 
     <tr> 
      <td style="text-align:center"> 
      <asp:UpdatePanel ID="UpdatePanel2" runat="server"> 
        <ContentTemplate> 
         <asp:Label ID="startDate" runat="server" Text="Start Date: "></asp:Label> 
         <asp:Label ID="startTime" runat="server" Text=""></asp:Label> 
         <hr /> 
         <asp:Label ID="stopDate" runat="server" Text="Stop Date: "></asp:Label> 
         <asp:Label ID="stopTime" runat="server" Text=""></asp:Label> 
         <hr /> 
        </ContentTemplate> 
       </asp:UpdatePanel> 
      </td> 
     </tr> 
    </table> 
</div> 
&nbsp 
<div> 
    <table align="center"> 
     <tr> 
      <td style="text-align:center"> 
      <asp:UpdatePanel ID="UpdatePanel3" runat="server"> 
       <ContentTemplate> 
         <asp:Label ID="hours" runat="server" ></asp:Label> 
         <asp:Label ID="minutes" runat="server" ></asp:Label> 
         <asp:Label ID="seconds" runat="server" ></asp:Label> 
       </ContentTemplate> 
      </asp:UpdatePanel> 
      </td> 
      <td> 
      <asp:UpdatePanel ID="UpdatePanel4" runat="server"> 
       <ContentTemplate> 
        <asp:Button ID="Button1" runat="server" OnClientClick="startCount()" Text="Start" Width="75px"/> 
       </ContentTemplate> 
      </asp:UpdatePanel> 
      </td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td> 
      <asp:UpdatePanel ID="UpdatePanel5" runat="server"> 
       <ContentTemplate> 
        <asp:Button ID="Button2" runat="server" OnClientClick="stopCount()" Text="Stop" Width="75px"/> 
        <asp:Button ID="Button3" runat="server" OnClientClick="reset()" Text="Reset" Width="75px"/> 
       </ContentTemplate> 
      </asp:UpdatePanel> 
      </td> 
     </tr> 
    </table> 
</div> 

这是在C#代码隐藏文件:

using System; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Timers; 

namespace NerdcoreTimer 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
    public int time_sec; 
    public int time_min; 
    public int time_hour; 
    public string start; 
    public string stop; 

    HttpCookie cookieStartDate = new HttpCookie("startDate"); 
    HttpCookie cookieTask = new HttpCookie("task"); 
    HttpCookie cookieSec = new HttpCookie("seconds"); 
    HttpCookie cookieMin = new HttpCookie("minutes"); 
    HttpCookie cookieHr = new HttpCookie("hours"); 
    HttpCookie cookieStopDate = new HttpCookie("stopDate"); 

    //SQL connection string 
    System.Data.SqlClient.SqlConnection sqlConnection1 = 
    new System.Data.SqlClient.SqlConnection("Server=*****;Database=*****;User Id=*****;Password=*****;"); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Check to see if there are cookies 
     if (Request.QueryString["startDate"] != null) 
     { 
      ReadCookie_StartDate(); 
     } 
     if ((Request.QueryString["seconds"] != null) && (Request.QueryString["minutes"] != null) && (Request.QueryString["hours"] != null)) 
     { 
      ReadCookie_Timer(); 
      //If the cookie values for seconds, minutes, and hours is not null, enable the timer and disable and enable the proper controls 
      Timer1.Enabled = true; 
      Stop.Enabled = true; 

      Start.Enabled = false; 
      Tasks.Enabled = false; 
     } 
     if (Request.QueryString["stopDate"] != null) 
     { 
      ReadCookie_StopDate(); 
     } 

     //Open the sql connection 
     sqlConnection1.Open(); 

     //Disable these controls on page load 
     Stop.Enabled = false; 
     Reset.Enabled = false; 

     //Make sure the timer is disabled if starting a new session 
     if (!IsPostBack) 
     { 
      Timer1.Enabled = false; 
     } 
    } 

    protected void ReadCookie_StartDate() 
    { 
     //Get the cookie names 
     String strCookieStart = Request.QueryString["startDate"].ToString(); 
     String strCookieTask = Request.QueryString["task"].ToString(); 

     //Grab the cookies 
     HttpCookie cookieStart = Request.Cookies[strCookieStart]; 
     HttpCookie cookieTask = Request.Cookies[strCookieTask]; 

     //Check to make sure the cookies exist 
     if ((cookieStart != null)&&(cookieTask != null)) 
     { 
      String strCookieStartValue = cookieStart.Value.ToString(); 
      startTime.Text = strCookieStartValue; 
      String strCookieTaskValue = cookieTask.Value.ToString(); 
      Tasks.SelectedValue = strCookieTaskValue; 
     } 
    } 

    protected void ReadCookie_Timer() 
    { 
     //Get the cookie names 
     String strCookieSec = Request.QueryString["seconds"].ToString(); 
     String strCookieMin = Request.QueryString["minutes"].ToString(); 
     String strCookieHr = Request.QueryString["hours"].ToString(); 

     //Grab the cookies 
     HttpCookie cookieSec = Request.Cookies[strCookieSec]; 
     HttpCookie cookieMin = Request.Cookies[strCookieMin]; 
     HttpCookie cookieHr = Request.Cookies[strCookieHr]; 

     //Check to make sure the cookies exist 
     if ((cookieSec != null)&&(cookieMin != null)&&(cookieHr != null)) 
     { 
      String strCookieSecValue = cookieSec.Value.ToString(); 
      String strCookieMinValue = cookieMin.Value.ToString(); 
      String strCookieHrValue = cookieHr.Value.ToString(); 
      sec1.Text = strCookieSecValue; 
      min1.Text = strCookieMinValue; 
      hour1.Text = strCookieHrValue; 
     } 
    } 

    protected void ReadCookie_StopDate() 
    { 
     //Get the cookie name 
     String strCookieStop = Request.QueryString["stopDate"].ToString(); 

     //Grab the cookie 
     HttpCookie cookieStop = Request.Cookies[strCookieStop]; 

     //Check to make sure the cookie exists 
     if (cookieStop != null) 
     { 
      String strCookieStopValue = cookieStop.Value.ToString(); 
      stopTime.Text = strCookieStopValue; 
     } 
    } 

    protected void Start_Click(object sender, EventArgs e) 
    { 
     //Start the timer 
     Timer1.Enabled = true; 

     //Get the start date 
     start = DateTime.Now.ToString(); 
     if (startTime.Text == "") 
     { 
      startTime.Text = start; 
     } 

     //Store the start date in a cookie 
     Start_Session(); 

     //Enable these controls 
     Stop.Enabled = true; 

     //Disable these controls 
     Start.Enabled = false; 
     Tasks.Enabled = false; 
     Reset.Enabled = false; 
    } 

    protected void Timer1_Tick(object sender, EventArgs e) 
    { 
     //Add to the sec1 label 
     time_sec = int.Parse(sec1.Text); 
     time_sec = time_sec + 1; 
     sec1.Text = time_sec.ToString(); 

     //Hide the sec2 label 
     if (sec1.Text == "10") 
     { 
      sec2.Visible = false; 
     } 

     //Add to the min1 label 
     if (sec1.Text == "60") 
     { 
      sec2.Visible = true; 
      time_min = int.Parse(min1.Text); 
      sec1.Text = "0"; 
      time_min = time_min + 1; 
      min1.Text = time_min.ToString(); 
     } 

     //Hide the min1 label 
     if (min1.Text == "10") 
     { 
      min2.Visible = false; 
     } 

     //Add to the hour1 label 
     if (min1.Text == "60") 
     { 
      min2.Visible = true; 
      time_hour = int.Parse(hour1.Text); 
      min1.Text = "0"; 
      time_hour = time_hour + 1; 
      hour1.Text = time_hour.ToString(); 
     } 

     //Hide the hour2 label 
     if (hour1.Text == "10") 
     { 
      hour2.Visible = false; 
     } 

     //Store the sec1, min1, and hour1 values into cookies 
     TimerTick_Session(); 
    } 

    protected void Stop_Click(object sender, EventArgs e) 
    { 
     //Get the stop date 
     stop = DateTime.Now.ToString(); 
     stopTime.Text = stop; 

     //Store the stop date in a cookie 
     Stop_Session(); 

     //Disable the timer and this control 
     Timer1.Enabled = false; 
     Stop.Enabled = false; 

     //Enable these controls 
     Start.Enabled = true; 
     Reset.Enabled = true; 

     //Store the selected task, start date, stop date and totalTime 
     string tsk = Tasks.SelectedValue; 
     string dateStart = startTime.Text; 
     string dateStop = stopTime.Text; 

     //Create a sql query string 
     string sqlString = "INSERT TimeSheet (Task,DateStart,DateStop) VALUES (@Task,@DateStart,@DateStop)"; 

     //Create a sql command using the query string 
     System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sqlString); 

     //Add the selected task value, start date value, stop date and totalTime values to the query 
     cmd.Parameters.AddWithValue("@Task", tsk); 
     cmd.Parameters.AddWithValue("@DateStart", dateStart); 
     cmd.Parameters.AddWithValue("@DateStop", dateStop); 

     //Give the sql command a connection string 
     cmd.Connection = sqlConnection1; 

     //Execute the sql command 
     cmd.ExecuteNonQuery(); 

     //Close the sql connection 
     sqlConnection1.Close(); 
    } 

    protected void Reset_Click(object sender, EventArgs e) 
    { 
     //Clear the start and stop date labels 
     startTime.Text = ""; 
     stopTime.Text = ""; 

     //Reset these counters 
     time_sec = 0; 
     time_min = 0; 
     time_hour = 0; 

     //Reset the timer labels 
     sec1.Text = "0"; 
     min1.Text = "0"; 
     hour1.Text = "0"; 

     //Make visible these timer labels 
     sec2.Visible = true; 
     min2.Visible = true; 
     hour2.Visible = true; 

     //Disable the timer and these controls 
     Timer1.Enabled = false; 
     Reset.Enabled = false; 
     Stop.Enabled = false; 

     //Enable these controls 
     Start.Enabled = true; 
     Tasks.Enabled = true; 
    } 

    protected void Start_Session() 
    { 
     //Create a new cookie for the start date and selected task 
     //HttpCookie cookieStartDate = new HttpCookie("startDate"); 
     //HttpCookie cookieTask = new HttpCookie("task"); 

     //Set the cookie values 
     cookieStartDate.Value = start; 
     cookieTask.Value = Tasks.SelectedValue; 

     //Set the cookie to expire in about 8 hours 
     DateTime startDateExp = DateTime.Now; 
     TimeSpan startDateExpMin = new TimeSpan(0, 500, 0); 
     cookieStartDate.Expires = startDateExp + startDateExpMin; 
     DateTime taskExp = DateTime.Now; 
     TimeSpan taskExpMin = new TimeSpan(0, 500, 0); 
     cookieTask.Expires = taskExp + taskExpMin; 

     //Add the cookie 
     Response.Cookies.Add(cookieStartDate); 
     Response.Cookies.Add(cookieTask); 
    } 

    protected void TimerTick_Session() 
    { 
     //Create a new cookies for the timer 
     /*HttpCookie cookieSec = new HttpCookie("seconds"); 
     HttpCookie cookieMin = new HttpCookie("minutes"); 
     HttpCookie cookieHr = new HttpCookie("hours");*/ 

     //Set the cookie values 
     cookieSec.Value = sec1.Text; 
     cookieMin.Value = min1.Text; 
     cookieHr.Value = hour1.Text; 

     //Set the cookies to expire in about 8 hours 
     DateTime secExp = DateTime.Now; 
     TimeSpan secExpMin = new TimeSpan(0, 500, 0); 
     cookieSec.Expires = secExp + secExpMin; 
     DateTime minExp = DateTime.Now; 
     TimeSpan minExpMin = new TimeSpan(0, 500, 0); 
     cookieMin.Expires = minExp + minExpMin; 
     DateTime hrExp = DateTime.Now; 
     TimeSpan hrExpMin = new TimeSpan(0, 500, 0); 
     cookieHr.Expires = hrExp + hrExpMin; 

     //Add the cookies 
     Response.Cookies.Add(cookieSec); 
     Response.Cookies.Add(cookieMin); 
     Response.Cookies.Add(cookieHr); 
    } 

    protected void Stop_Session() 
    { 
     //Create a new cookie for the stop date 
     //HttpCookie cookieStopDate = new HttpCookie("stopDate"); 

     //Set the cookie value 
     cookieStopDate.Value = stop; 

     //Set the cookie to expire in about 8 hours 
     DateTime stopDateExp = DateTime.Now; 
     TimeSpan stopDateExpMin = new TimeSpan(0, 500, 0); 
     cookieStopDate.Expires = stopDateExp + stopDateExpMin; 

     //Add the cookie 
     Response.Cookies.Add(cookieStopDate); 
     } 
    } 
} 

获得此代码保存会话状态的任何帮助将不胜感激。谢谢。

+1

可以在客户端修改cookie。在你的情况下,员工可以随时修改秒表。 – Blachshma

+0

此外,为什么不保存一个GUID,这是一种会话ID作为客户端的cookie。 REAL数据,例如当计时器启动时将存储在服务器上并通过此会话ID引用? – Blachshma

+0

我想出了如何做到这一点,但如果在截止日期前有足够的时间,我也想尝试一下你的方法。 – user1910256

回答

0

我想快速评论数据库处理,因为您可能想要考虑从表示层抽象数据层,换句话说,考虑创建一个单独的项目或类来处理数据,而不是做所有事情同一个地方。

此外,您可能已经发现,但View State在发布后备之间保留页面状态,因为它将会话信息存储在页面上,但在重新加载的情况下,则不再有视图状态。

除此之外,我道歉,我很快就读了它,但似乎你正在尝试重写微软会话处理,寻找asp.net会话处理。

这些是我的2美分。

相关问题