制作一个投票系统
例6.11 在一些文体类门户网站中,经常设立一项在线投票功能,为了在投票系统中确保准确率,防止重复投票是一项必不可少的举措。本实例将制作一个投票系统并且防止重复投票,如图6.13所示。(实例位置:光盘\TM\Instances\06\ch11)
|
图6.13 在线投票 |
程序实现的主要步骤如下:
(1)新建一个网站,命名为ch11,默认主页名为Default.aspx。
(2)在页Default.aspx中添加一个Table表格,用来布局页面。在该Table表格上添加一个RadioButtonList控件,供用户选择投票。再添加两个Button控件,分别用于执行投票和查询投票结果。
(3)创建一个新页Result.aspx,用于显示投票结果。在该页中添加一个GridView控件用于显示投票结果。
(4)主要程序代码如下。
在页面Default.aspx中,用户单击"我要投票"按扭后,首先判断用户是否已投过票,如果用户已投票,则弹出对话框提示用户;如果用户是第一次投票,则利用Cookie对象保存用户的IP地址,并弹出对话框提示用户投票成功。代码如下:
- //进行投票
- protected void Button1_Click(object sender, EventArgs e)
- {
- //判断指定的IP是否已投过票了,如果已经投过了,则弹出提示对话框
- string UserIP = Request.UserHostAddress.ToString( );
- int VoteID = Convert.ToInt32(RadioButtonList1.
SelectedIndex.ToString( ))+1; - HttpCookie oldCookie=Request.Cookies["userIP"];
- if (oldCookie == null)
- {
- UpdateVote(VoteID);
- Response.Write("<script>alert('投票成功,谢谢您的参与!')</script>");
- //定义新的Cookie对象
- HttpCookie newnewCookie = new HttpCookie("userIP");
- newCookie.Expires = DateTime.MaxValue ;
- //添加新的Cookie变量IPaddress,值为UserIP
- newCookie.Values.Add("IPaddress", UserIP);
- //将变量写入Cookie文件中
- Response.AppendCookie(newCookie);
- return;
- }
- else
- {
- string userIP = oldCookie.Values["IPaddress"];
- if (UserIP.Trim( ) == userIP.Trim( ))
- {
- Response.Write("<script>alert('一个IP地址
只能投一次票,谢谢您的参与!');history.go(-1);</script>"); - return;
- }
- else
- {
- HttpCookie newnewCookie = new HttpCookie("userIP");
- newCookie.Values.Add("IPaddress", UserIP);
- newCookie.Expires = DateTime.MaxValue ;
- Response.AppendCookie(newCookie);
- UpdateVote(VoteID);
- Response.Write("<script>alert('投票成功,谢谢您的参与!')</script>");
- return;
- }
- }
- }
为了使投票结果更直观,在显示投票结果页Result.aspx中,将投票结果以百分比的形式显示在页面上。实现此功能,需要将页Result.aspx切换到HTML视图中,并将自定义方法FormatVoteCount(string voteCount)绑定在显示框的百分比列中。代码如下: - <asp:TemplateField HeaderText ="所占总票的百分比" >
- <ItemTemplate>
- <%#FormatVoteCount(DataBinder.Eval(Container.
DataItem, "NumVote").ToString ( ))%>% - </ItemTemplate>
- </asp:TemplateField>
当投票结果显示框绑定时,使用自定义方法FormatVoteCount(string voteCount),将百分比列显示在界面中。代码如下: - public int FormatVoteCount(string voteCount)
- {
- int total = TotalNum( );
- //如果没有被投票
- if (voteCount.Length <= 0)
- {
- //返回0个百分比
- return(0);
-
- }
- if (total > 0)
- {
- //返回实际的百分比
- return (int.Parse(voteCount)*100/total);
- }
- return (0);
- }
|