民意调查的界面实现_前期问题归纳
首先来看Admin文件夹下的ManagePolls.aspx页面:
设计视图:
这个界面布局非常类似UI(Web版),这里不再详述。只不过,把其中遇到的问题做个小小归纳,或许你也会碰到类似的问题。
这个是DAL层的具体数据提供程序SqlPollsProvider,我们要注意的是下滑红线,由于方法跟具体的存储过程对应,其方法参数对应了存储过程的参数名。这里并没有什么问题。(其中GetPolls方法的两个参数对应存储过程的两个bit参数)
但是编码到BLL层的时候,我们曾经统一了业务域对象的主键名为Id。并且还把重复的尤其是可能关于审计追踪方面的属性提取到父类BasePoll.cs中。
界面中GridView绑定了ObjectDataSource控件,我们知道DataKeyName我们设定为Id,如果业务域对象的方法的参数不改为Id,难免会出现传值错误(如主键值为0,会引发读取不到记录的错误),所以,在域对象的方法中,主键的参数名也改为Id。
PollOption中也是类似改动。(这里省略),我们再注意Poll.cs中的GetPolls方法,虽然DAL层中对应方法是int类型,但其实调用存储过程传递的参数是bit,为了GridView绑定方便,这里设置bool类型将更便于界面编辑的方便。(可以明确赋值)
如果这里还保持int类型,DefaultValue的情况势必事先需要知道0与1的含义。 当然,最好的解决方法是将DAL层的GetPolls方法改为bool类型参数。
再来看看后台的存储过程:GetCurrentPollID,这里给出了两种写法:
如果是上面第一种写法,后台的SqlPollsProvider的调用方式为:
这里必须指明outparam的Direction为Output,否则调用出错,而且执行为Command命令后,必须再获取输出参数的Value。
如果是第二种存储过程写法,对应的代码调用如下:
可以看到,显得简洁多了。大家可以根据自己的喜好来选择自己的存储过程返回值的输出方式。
再次回到第一个UI截图:
发现:Id,创建日期,创建人都是不能更新的,设置的时候对应的DetailsView的字段属性(关注InsertVisible/ReadOnly)
如果是插入模式:
关键是绑定的业务域提供的数据变动方法的参数对应要减少。
那么调用DAL层的对应方法时这减少的两个参数如何传递呢?很显然,addedDate可取系统当前日期,addedBy则是登录网站的用户名,在以前的成员配置系统中已经详述。同样,PollOption.cs的插入方法也需要类似改动。
我们把用户名属性提取到父类BLL层中BizObject.cs中。(用户的IP地址也一块封装),如图:
后续的文章将实现更改登录用户的密码/注册/只有Administrators角色的成员访问该页面权限/封装民意调查投票<结果>的用户控件。
参考的代码如下:
Admin/ManagePolls.aspx
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ManagePolls.aspx.cs" Inherits="admin_ManagePolls" %>
2
3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6 <head runat="server">
7 <title></title>
8 </head>
9 <body>
10 <form id="form1" runat="server">
11 管理民意问卷<br />
12 <a href="">管理归档民意</a><br />
13 <asp:GridView ID="gvPolls" runat="server" AutoGenerateColumns="False"
14 DataKeyNames="Id" DataSourceID="odsPolls" EnableModelValidation="True"
15 onselectedindexchanged="gvPolls_SelectedIndexChanged"
16 EmptyDataText="没有找到匹配的问卷记录!" onrowdeleted="gvPolls_RowDeleted"
17 onrowcommand="gvPolls_RowCommand">
18 <Columns>
19 <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" />
20 <asp:BoundField DataField="QuestionText" HeaderText="问卷"
21 SortExpression="QuestionText" />
22 <asp:BoundField DataField="Votes" HeaderText="投票数" SortExpression="Votes" />
23 <asp:TemplateField HeaderText="默认">
24 <EditItemTemplate>
25 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
26 </EditItemTemplate>
27 <ItemTemplate>
28 <asp:Image ID="Image1" ImageUrl="~/images/OK.gif" runat="server" Visible='<%# Eval("IsCurrent") %>' />
29 </ItemTemplate>
30 </asp:TemplateField>
31 <asp:CommandField ButtonType="Image" SelectImageUrl="~/images/Edit.gif"
32 SelectText="编辑问卷" ShowSelectButton="True" />
33 <asp:ButtonField ButtonType="Image" ImageUrl="~/images/Folder.gif" Text="归档"
34 CommandName="Archive" />
35 <asp:TemplateField ShowHeader="False">
36 <ItemTemplate>
37 <asp:ImageButton ID="ImageButton1" runat="server" CausesValidation="False"
38 CommandName="Delete" ImageUrl="~/images/Delete.gif"
39 onclientclick="return confirm('是否删除该问卷?');" Text="删除" />
40 </ItemTemplate>
41 </asp:TemplateField>
42 </Columns>
43 </asp:GridView>
44 <br />
45 <table border="0" cellspacing="0" cellpadding="0">
46 <tr>
47 <td width="40%">
48 <asp:DetailsView ID="dvPoll" runat="server" Height="50px" Width="268px"
49 AutoGenerateRows="False" DataSourceID="odsPoll"
50 EnableModelValidation="True" DataKeyNames="Id" DefaultMode="Insert"
51 HeaderText="问卷信息"
52 onitemcommand="dvPoll_ItemCommand"
53 oniteminserted="dvPoll_ItemInserted" onitemupdated="dvPoll_ItemUpdated">
54 <Fields>
55 <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False"
56 ReadOnly="True" SortExpression="Id" />
57 <asp:BoundField DataField="AddedDate" HeaderText="创建日期" InsertVisible="False"
58 ReadOnly="True" SortExpression="AddedDate" />
59 <asp:BoundField DataField="AddedBy" HeaderText="创建人" InsertVisible="False"
60 ReadOnly="True" SortExpression="AddedBy" />
61 <asp:TemplateField HeaderText="问卷" SortExpression="QuestionText">
62 <EditItemTemplate>
63 <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("QuestionText") %>'
64 Height="110px" TextMode="MultiLine" Width="215px"></asp:TextBox>
65 <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
66 ControlToValidate="TextBox1" Display="Dynamic" ErrorMessage="问卷问题不能为空!"
67 ValidationGroup="edtPoll">*</asp:RequiredFieldValidator>
68 </EditItemTemplate>
69 <InsertItemTemplate>
70 <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("QuestionText") %>'
71 Height="96px" TextMode="MultiLine" Width="206px"></asp:TextBox>
72 <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
73 ControlToValidate="TextBox1" Display="Dynamic" ErrorMessage="问卷问题不能为空!"
74 ValidationGroup="edtPoll">*</asp:RequiredFieldValidator>
75 </InsertItemTemplate>
76 <ItemTemplate>
77 <asp:Label ID="Label1" runat="server" Text='<%# Bind("QuestionText") %>'></asp:Label>
78 </ItemTemplate>
79 </asp:TemplateField>
80 <asp:CheckBoxField DataField="IsCurrent" HeaderText="默认"
81 SortExpression="IsCurrent" />
82 <asp:CommandField ValidationGroup="edtPoll" ShowEditButton="True" ShowInsertButton="True" />
83 </Fields>
84 </asp:DetailsView>
85 </td>
86 <td>
87 <asp:Panel ID="pnlOptions" Visible="false" runat="server">
88 <asp:GridView ID="gvOptions" runat="server" AutoGenerateColumns="False"
89 DataKeyNames="Id" DataSourceID="odsOptions" EmptyDataText="没有匹配的选项列表!"
90 EnableModelValidation="True"
91 onselectedindexchanged="gvOptions_SelectedIndexChanged"
92 onrowdeleted="gvOptions_RowDeleted">
93 <Columns>
94 <asp:BoundField DataField="OptionText" HeaderText="选项"
95 SortExpression="OptionText" />
96 <asp:BoundField DataField="Votes" HeaderText="票数" SortExpression="Votes" />
97 <asp:BoundField DataField="Percentage" HeaderText="%"
98 SortExpression="Percentage" />
99 <asp:CommandField ButtonType="Image" SelectImageUrl="~/images/Edit.gif"
100 ShowSelectButton="True" />
101 <asp:TemplateField ShowHeader="False">
102 <ItemTemplate>
103 <asp:ImageButton ID="ImageButton1" runat="server" CausesValidation="False"
104 CommandName="Delete" ImageUrl="~/images/Delete.gif"
105 onclientclick="return confirm('是否删除该选项?');" Text="删除" />
106 </ItemTemplate>
107 </asp:TemplateField>
108 </Columns>
109 </asp:GridView>
110 <asp:DetailsView ID="dvOption" runat="server" Height="50px" Width="275px"
111 AutoGenerateRows="False" DataKeyNames="Id" DataSourceID="odsOption"
112 DefaultMode="Insert" EnableModelValidation="True" HeaderText="选项信息"
113 onitemcommand="dvOption_ItemCommand"
114 oniteminserted="dvOption_ItemInserted" onitemupdated="dvOption_ItemUpdated">
115 <Fields>
116 <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False"
117 SortExpression="Id" ReadOnly="True" />
118 <asp:BoundField DataField="AddedBy" HeaderText="创建人" InsertVisible="False"
119 ReadOnly="True" SortExpression="AddedBy" />
120 <asp:TemplateField HeaderText="选项" SortExpression="OptionText">
121 <EditItemTemplate>
122 <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("OptionText") %>'
123 Height="49px" TextMode="MultiLine" Width="206px"></asp:TextBox>
124 <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
125 ControlToValidate="TextBox1" Display="Dynamic" ErrorMessage="选项不能为空!"
126 ValidationGroup="edtOption">*</asp:RequiredFieldValidator>
127 </EditItemTemplate>
128 <InsertItemTemplate>
129 <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("OptionText") %>'
130 Height="51px" TextMode="MultiLine" Width="198px"></asp:TextBox>
131 <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
132 ControlToValidate="TextBox1" Display="Dynamic" ErrorMessage="选项不能为空!"
133 ValidationGroup="edtOption">*</asp:RequiredFieldValidator>
134 </InsertItemTemplate>
135 <ItemTemplate>
136 <asp:Label ID="Label1" runat="server" Text='<%# Bind("OptionText") %>'></asp:Label>
137 </ItemTemplate>
138 </asp:TemplateField>
139 <asp:BoundField DataField="AddedDate" HeaderText="创建日期" InsertVisible="False"
140 ReadOnly="True" SortExpression="AddedDate" />
141 <asp:CommandField ValidationGroup="edtOption" ShowEditButton="True" ShowInsertButton="True" />
142 </Fields>
143 </asp:DetailsView>
144 </asp:Panel>
145 </td>
146 </tr>
147 </table>
148 <asp:ObjectDataSource ID="odsPolls" runat="server" DeleteMethod="DeletePoll"
149 SelectMethod="GetPolls" TypeName="BLL.Poll">
150 <DeleteParameters>
151 <asp:Parameter Name="id" Type="Int32" />
152 </DeleteParameters>
153 <SelectParameters>
154 <asp:Parameter DefaultValue="true" Name="includeActive" Type="Boolean" />
155 <asp:Parameter DefaultValue="false" Name="includeArchived" Type="Boolean" />
156 </SelectParameters>
157 </asp:ObjectDataSource>
158 <asp:ObjectDataSource ID="odsPoll" runat="server" InsertMethod="InsertPoll"
159 SelectMethod="GetPoll" TypeName="BLL.Poll" UpdateMethod="UpdatePoll">
160 <InsertParameters>
161 <asp:Parameter Name="questionText" Type="String" />
162 <asp:Parameter Name="isCurrent" Type="Boolean" />
163 </InsertParameters>
164 <SelectParameters>
165 <asp:ControlParameter ControlID="gvPolls" Name="id"
166 PropertyName="SelectedValue" Type="Int32" />
167 </SelectParameters>
168 <UpdateParameters>
169 <asp:Parameter Name="id" Type="Int32" />
170 <asp:Parameter Name="questionText" Type="String" />
171 <asp:Parameter Name="isCurrent" Type="Boolean" />
172 </UpdateParameters>
173 </asp:ObjectDataSource>
174 <asp:ObjectDataSource ID="odsOptions" runat="server"
175 DeleteMethod="DeletePollOption" SelectMethod="GetPollOptions"
176 TypeName="BLL.PollOption">
177 <DeleteParameters>
178 <asp:Parameter Name="id" Type="Int32" />
179 </DeleteParameters>
180 <SelectParameters>
181 <asp:ControlParameter ControlID="gvPolls" Name="pollId"
182 PropertyName="SelectedValue" Type="Int32" />
183 </SelectParameters>
184 </asp:ObjectDataSource>
185 <asp:ObjectDataSource ID="odsOption" runat="server"
186 InsertMethod="InsertPollOption" SelectMethod="GetPollOption"
187 TypeName="BLL.PollOption" UpdateMethod="UpdatePollOption">
188 <InsertParameters>
189 <asp:Parameter Name="optionText" Type="String" />
190 <asp:ControlParameter ControlID="gvPolls" Name="pollId"
191 PropertyName="SelectedValue" Type="Int32" />
192 </InsertParameters>
193 <SelectParameters>
194 <asp:ControlParameter ControlID="gvOptions" Name="id"
195 PropertyName="SelectedValue" Type="Int32" />
196 </SelectParameters>
197 <UpdateParameters>
198 <asp:Parameter Name="id" Type="Int32" />
199 <asp:Parameter Name="optionText" Type="String" />
200 </UpdateParameters>
201 </asp:ObjectDataSource>
202 </form>
203 </body>
204 </html>
当来之世,经道灭尽,我以慈悲哀愍,特留此经止住百岁。其有众生,值斯经者,随意所愿,皆可得度。(南无阿弥陀佛)
道可道,非常道;名可名,非常名。
我常说,一个国家,一个民族,亡国都不怕,最可怕的是一个国 家和民族自己的根本文化亡掉了,这就会沦为万劫不复,永远不会翻身。---南怀瑾<国学大师>