2012-04-10 32 views
0

我写的ASP.Net应用程序,允许匿名人士张贴祈祷和其他人评论/确认到这些对象祈祷cookie和session。祷告存储在SQL Server 2008数据库中,并带有一个唯一的标识符。问题关于在ASP.net应用

他们正在使用一个中继器控制和隐藏字段存储行的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

,要求用户登录这个网站? – 2012-04-10 00:04:26

回答

2

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

饼干会是更好的选择,且仅当他们明确自己的cookie将这个数据消失。

如果你不需要用户登录,我想这是你所能做的。

继承人上的cookies 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是真的要设置启用为false。

+0

感谢您的反馈。我已经有一个工作更新面板与存储过程调用数据库更新用户点击按钮时的祈祷次数。唯一的问题是,用户可以无限坐在他们,并点击按钮,只是看数字上去它还挺失败的目的。我已阅读MSDN文章。希望得到关于如何实现这种行为的更具体的建议。有什么样的集合,我可以迭代cookie可以放在里面?我怎样才能比较cookies和Repeater项目? – WonderPanda 2012-04-10 00:46:18

+0

我更新了我的答案以上几件事。据我所知,浏览器不共享cookie,所以如果有人使用不同的浏览器,他们的所有cookies都会消失。长话短说,如果你想要最好的/最一致的结果,你将不得不迫使他们登录。这也将保护你的东西像垃圾邮件机器人,并使其更容易做上述情况,通过存储他们的祈祷在数据库中。 – 2012-04-10 01:17:31

+0

真棒我会试试看看它是如何工作的。最终,我肯定会添加成员资格添加,然后管理这样的事情将是一个简单的交界表,但我想保留一个匿名功能,以使不想通过注册过程的人更容易访问该网站。我采取的验证码为匿名用户防止垃圾邮件,现在,以及审批过程之前祈祷实际上得到张贴到网站。感谢您迄今为止的所有帮助 – WonderPanda 2012-04-10 01:27:57

0

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

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

对于您所描述的代码,我想你可以使用一个ASP.NET UpdatePanel这将让你更新/示人祈求的项目数量和禁用按钮。