0

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

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

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

据我了解,我可以将数据存储在 cookie/会话中,因此到目前为止我能想到的唯一解决方案是将行的 ID 存储到这些对象之一中,然后在我的转发器控件中使用自定义逻辑来检查看看有哪些。

谁能提供一些关于完成此类事情的最有效方法可能是什么的见解?如果除了 cookie 或 session 之外还有其他选项,我也很高兴听到。

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

代码隐藏:

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 的方法背后的代码?

4

2 回答 2

2

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

Cookie 将是更好的选择,只有在他们清除 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,您将禁用相应的祈祷按钮。

我不知道如何解决这个问题,因为我知道你的绑定方式,但它看起来像这样:

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") %>' />

如果 HasPrayed 为真,则使用!(bool)Eval("HasPrayed")因为您想将启用设置为假。

于 2012-04-10T00:14:16.610 回答
0

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

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

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

于 2012-04-10T00:18:47.907 回答