有关ASP.net应用程序中的cookie和会话的问题

时间:2012-04-10 00:00:54

标签: javascript asp.net session cookies

我正在编写一个ASP.Net应用程序,允许匿名人员发布祷告和其他人评论/确认为这些对象祷告。祷告存储在具有唯一标识符的SQL Server 2008数据库中。

使用转发器控件和隐藏字段显示它们以存储行的ID。转发器中的每个项目都包含一个按钮,允许匿名人员进行祈祷,并在数据库中作为计数器递增。

基本上,一旦用户确认他/她正在为此项目祈祷,我想禁用该按钮并显示该行的总计数。

我的理解是我可以将数据存储在cookie /会话中,因此到目前为止我唯一能够提出的解决方案是将行的ID存储到其中一个对象中,然后在我的转发器中使用自定义逻辑控制以检查哪些存在。

任何人都可以提供一些见解,了解实现此类目标的最有效方法是什么?如果有cookie或会话以外的选项,我也很高兴听到这个。

编辑: 我正在尝试使用以下逻辑来实现此解决方案。

代码隐藏:

protected bool IsPrayerInCookie(string prayerId)
    {
        if(Request.Cookies["prayers"][prayerId] != null)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

ASPX:

 <span class="confirmed_prayers"><span class="trans">
                            <asp:Label runat="server" ID="lblConfirmedPrayers" Text='<%# Eval("ConfirmedPrayers") %>' />
                            people have prayed for this.</span></span>
                            <% if(!IsPrayerInCookie(Eval("PrayerId").ToString())) 
                                {   
                            %>
                                <asp:LinkButton ID="btnPray" CssClass="but_styled" runat="server" TabIndex="8" CommandName="IncrementPrayer">
                                <span><span class="check">
                                    Pray for This</span></span></asp:LinkButton>
                            <%
                                }
                            %>

然而,这不起作用。任何人都可以帮我弄清楚如何使if语句在aspx文件中工作,以正确的方式使用正确的ID调用后面的代码吗?

2 个答案:

答案 0 :(得分:2)

会话只会在用户在网站上时持续。因此,如果他们关闭浏览器并返回,它就会消失。

Cookies是更好的选择,只有当他们清除他们的cookie时,这些数据才会消失。

如果您不要求用户登录,我认为这就是您所能做的。

关于cookie的MSDN页面:

http://msdn.microsoft.com/en-us/library/ms178194.aspx

对于实际的cookie存储,我会做类似的事情:

Response.Cookies["prayerlist"][CurrentPrayerItemID].Value = "something"; //All that matters is that they have the cookie with this ID.
Response.Cookies["prayerlist"].Expires = DateTime.MaxValue;

因此,当有人点击添加该项时,您首先要检查他们的Cookie中是否已有该ID,如下所示:

if(Response.Cookies["prayerlist"][CurrentPrayerItemID] != null)
{
    Response.Cookies["prayerlist"][CurrentPrayerItemID].value = "something";

    // Add prayer to Database
}

同样,每当绑定转发器时,都会检查cookie。如果他们有那个cookie,你将禁用相应的祈祷按钮。

我不知道如何处理这个问题,因为idk如何绑定,但它看起来像这样:

foreach(Item item in YourListOfItemsThatYouAreBindingToTheRepeater)
{
    if(Response.Cookies["prayerlist"][CurrentPrayerItemID] != null)
    {
        //Disable Button - Set "HasPrayed" = true
    }
}

要实际禁用该按钮,我要做的是将列表中的值设置为false,然后在aspx页面中执行以下操作:

<asp:Button ID="button1" runat="server" Enabled='<%# !(bool)Eval("HasPrayed") %>' />

使用!(bool)Eval("HasPrayed"),因为如果HasPrayed为true,则要将enabled设置为false。

答案 1 :(得分:0)

您可以使用会话来存储用户点击过的祈祷项目,但是当他们回到您的网站时,会忘记之前的所有项目,因为会话已经丢失。

在这种情况下,您可以使用cookie来存储用户点击“我会为此祈祷”按钮的所有祈祷项ID。如果您不想要用户登录,我会选择此路线。

对于您所描述的代码,我认为您可以使用ASP.NET UpdatePanel来更新/显示为该项目祈祷的人数并禁用该按钮。