时间:2021-07-01 10:21:17 帮助过:10人阅读
- <br><asp:ObjectDataSource ID="DataSource" runat="server" SelectMethod="SelectDatas" <br>TypeName="MilitaryShopWeb.Admin.SystemConfig.SysLog" DataObjectTypeName="MilitaryShopModel.Log" EnablePaging="True" <br>MaximumRowsParameterName="maxRows" StartRowIndexParameterName="startIndex" SelectCountMethod="CountAll" DeleteMethod="DeleteData"> <br><SelectParameters> <br><asp:ControlParameter ControlID="ddlCate" PropertyName="SelectedValue" Name="cate" /> <br><asp:ControlParameter ControlID="ddlArea" PropertyName="SelectedValue" Name="area" /> <br><asp:ControlParameter ControlID="tbBeginTime" PropertyName="Text" Name="begintime" /> <br><asp:ControlParameter ControlID="tbEndTime" PropertyName="Text" Name="endtime" /> <br></SelectParameters> <br></asp:ObjectDataSource> <br> <br> 给定的代码不是完整的代码,因为我在例子中使用的NHibernate作为数据持久层,这样我不太方便讲整个可执行代码都贴出来,还望大家能谅解!不过从上面的代码中可以看出,我们可以直接在ObjectDataSource的标记中引入SelectParameters参数列表,将要作为查询参数的控件依次通过ControlParameter标记给出。其中ControlID为指定的控件ID,PropertyName为控件取值的属性名称,Name为参数名称,这个与SelectMethod中的查询参数签名相对应。 <br><br> 下面是服务端代码。这里顺便给出了DeleteMethod方法的实现,代码中引入了其它的类库,读者只需看明白其中的道理即可! <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>public List<Log> SelectDatas(int startIndex, int maxRows, string cate, string area, string begintime, string endtime) <br>{ <br>int itemCount; <br>int pageIndex = 1; <br>if (startIndex > 0) <br>{ <br>pageIndex = (startIndex) / PageSize + 1; <br>} <br><br>LogBll bll = new LogBll(); <br>List<ICriterion> query = new List<ICriterion>(); <br>ICriterion[] expression = null; <br>if (cate != "-1") <br>{ <br>query.Add(Restrictions.Eq("Logtype", cate)); <br>} <br>if (area != "-1") <br>{ <br>query.Add(Restrictions.Eq("Applicationarea", area)); <br>} <br>if (begintime != null && begintime.Trim().Length > 0) <br>{ <br>query.Add(Restrictions.Ge("Logtime", DateTime.Parse(begintime.Trim()))); <br>} <br>if (endtime != null && endtime.Trim().Length > 0) <br>{ <br>query.Add(Restrictions.Le("Logtime", DateTime.Parse(endtime.Trim()))); <br>} <br><br>if (query.Count > 0) <br>{ <br>expression = query.ToArray(); <br>} <br><br>try <br>{ <br>List<Log> list = bll.GetProducts(expression, pageIndex, maxRows, out itemCount); <br>ViewState["ITEMCOUNT"] = itemCount; <br>return list; <br>} <br>catch (Exception ex) <br>{ <br>Log log = new Log(LogType.Error.ToString(), ex.Message, DateTime.Now, ApplicationArea.SysLogManage.ToString(), ex.StackTrace); <br>ApplicationLog.Write(log); <br>} <br><br>return null; <br>} <br><br>public static void DeleteData(Log obj) <br>{ <br>try <br>{ <br>LogBll bll = new LogBll(); <br>bll.Delete(obj.Id); <br>ScriptHelper.ShowMessage("删除成功!"); <br>} <br>catch (Exception ex) <br>{ <br>Log log = new Log(LogType.Error.ToString(), ex.Message, DateTime.Now, ApplicationArea.ProductCategoriesList.ToString(), ex.StackTrace); <br>ApplicationLog.Write(log); <br>ScriptHelper.ShowMessage("删除失败!请查看数据库日志以确定失败原因。"); <br>} <br>} <br><br>public int CountAll(string cate, string area, string begintime, string endtime) <br>{ <br>return Convert.ToInt32(ViewState["ITEMCOUNT"] ?? 0); <br>} <br> <br> CountAll的参数签名必须和SelectDatas的参数签名相同。在这里,查询参数的数据类型是NHibernate的ICriterion数组,在SelectDatas中首先会判断指定控件的值是否为空,不为空则构建ICriterion查询数组,然后将参数传递给底层代码进行数据查询。在这里没有直接引用页面上的控件,而是通过查询参数来获取的值。这样,当用户指定查询或者查看全部数据时,我们几乎不用做任何事情。 <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>private void RefreshData() <br>{ <br>lvList.DataSourceID = DataSource.ID; <br>} <br><br>protected void btDoQuery_Click(object sender, EventArgs e) <br>{ <br>RefreshData(); <br>} <br><br>protected void btAll_Click(object sender, EventArgs e) <br>{ <br>this.ddlArea.SelectedValue = "-1"; <br>this.ddlCate.SelectedValue = "-1"; <br>this.tbBeginTime.Text = string.Empty; <br>this.tbEndTime.Text = string.Empty; <br>RefreshData(); <br>} <br> <br> RefreshData方法只是将ListView的数据源重新指向ObjectDataSource,以实现数据绑定的“刷新”效果。btDoQuery_Click只需要执行一下RefreshData方法即可,因为页面上控件的值已经通过ControlParameter查询参数传递给ObjectDataSource了,我们没有其它的东西需要处理。别忘了!服务器端控件的值在默认情况下是可以回传的。btAll_Click是查询全部数据,此时我们只需要将控件中的值清空,然后重新执行RefreshData方法即可。 <br><br> 是不是很简单啊?其实ObjectDataSource控件的功能还是很强大的,以后绑定页面数据,尤其是带有分页效果时建议多用ObjectDataSource控件,它可以节省很多的开发时间。</li><li> </li><li> </li></ol></pre></li></ol></pre>