网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

ASP.NETMVC实现(查询+分页)【附示例代码下载】

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

在asp.net中我们知道有viewstate这样的页面级容器为我们保存表单数据,这样我们每次提交时数据都不会丢失,很容易的完成查询+分页的实现。找过相关MVC分页的例子,都是扩展HtmlHelper方法来实现。我想大家在ASP.NET开发中都用过 wuqi的AspNetPager分页控件以及dacey的NSunPage用来开发Winform项目的分页控件非常方便的满足了大家的分页需求。那么我们来看下在MVC中的查询+分页是怎么实现的。(这里我用到了wuqi的mvcpager)
下面例子是asp.net中的分页查询:【示例源码下载】
前台代码:

  1. <html> 
  2. <body> 
  3. <form id="form1" runat="server"> 
  4. 部门编号:<asp:TextBox ID="deptcode" Width="80px" runat="server"></asp:TextBox> 
  5. 部门名称:<asp:TextBox ID="deptname" Width="80px" runat="server" ></asp:TextBox> 
  6. <asp:Button ID="btnquery" runat="server" Text="查询" onclick=" btnquery_Click"/> 
  7. <table class="TableBlock" width="100%" style="margin-top: 10px;"> 
  8.               <tr> 
  9.               <th>编号</th> 
  10.               <th>名称</th> 
  11.               </tr> 
  12. <asp:Repeater ID="TableBlockList" runat="server"> 
  13.   <ItemTemplate> 
  14.               <tr> 
  15.               <td><%#Eval("code")  %></td> 
  16.               <td><%#Eval("name")  %></td> 
  17. </tr> 
  18.   </ItemTemplate> 
  19.   </asp:Repeater> 
  20. </table> 
  21. </form> 
  22. </body> 
  23. </html> 

后台代码:

  1. protected virtual SelectSqlSection GetSelectSearch() 
  2.       SelectSqlSection select = db.GetSelectSqlSection (); 
  3.       if (!string.IsNullOrEmpty (deptname.Text))  {                  
  4.           select.Where (View_DeptQueryInfo.__name.Like(deptname.Text  + "%")); 
  5.       } 
  6.       if(!string.IsNullOrEmpty(deptcode.Text)){ 
  7.           select.Where (View_DeptQueryInfo.__code.Like(deptcode.Text  + "%")); 
  8.       } 
  9.       return select;  
  10. protected void BindTable(Repeater rpt, AspNetPager anp) 
  11.       int countPage = 0; 
  12.       DataTable dt =db.SelectPageToDataTable(GetSelectSearch (), anp.PageSize, anp.CurrentPageIndex,  
  13. out countPage); 
  14.       anp.RecordCount = countPage; 
  15.       rpt.DataSource = dt; 
  16.       rpt.DataBind(); 
  17. }  

以上就完成了查询分页的功能,没什么特别的和我们做winform的差不多。第二次查询一样能获得表单内的值。

    那么asp.net mvc中怎么实现呢?用什么来保存表单数据呢?记得原来写java的时候我是用session这样笨拙的方法来保存查询提交后的方法来保存用户查询条件的。那么在asp.net mvc中我们该怎么实现呢?

 页面代码:

  1. <html> 
  2. <body> 
  3.     <form id="form1" method="post" action="/Dept/Dept" runat="server">  
  4.      部门名称:<input id="deptname" name=" deptname " type="text" value='<%=ViewData ["deptname "] %>'/> 
  5.      部门编号:<input id="deptcode" name=" deptcode " type="text" value='<%=ViewData ["deptcode "] %>'/>  
  6. <input id="btnquery" type="submit" value="查询 "/> 
  7. <table class="TableBlock" width="100%"> 
  8.         <tr>  
  9.             <th>编号</th> 
  10.             <th>部门名称</th> 
  11.        </tr> 
  12. <asp:MvcRepeater ID="MvcRepeater1" Key="deptlist" runat="server"> 
  13.             <ItemTemplate> 
  14.               <tr>  
  15.               <td style="width:5;"><%# Eval("code")%></td> 
  16.               <td style="width:10;"><%# Eval("name")%></td> 
  17.               </tr> 
  18.             </ItemTemplate> 
  19. </asp:MvcRepeater>    
  20. </table> 
  21. <div class="pager" style="width:100%;text-align:right;"> 
  22.         <div class="pager" align="left" style="float: left; width: 40%;"> 
  23. <%="共 "+ ((Webdiyer.WebControls.Mvc.PagedList<DepartmentInfo>)ViewData ["deptlist"]).TotalPageCount + "页" +  ((Webdiyer.WebControls.Mvc.PagedList<DepartmentInfo>)ViewData ["deptlist"]).TotalItemCount + "条"%></div> 
  24. <div align="right" class="pager" style="width: 60%; float: left;"> <%=Html.Pager<DepartmentInfo> ((Webdiyer.WebControls.Mvc.PagedList<DepartmentInfo>)ViewData ["deptlist"], new PagerOptions() { PageIndexParameterName = "id"CurrentPagerItemWrapperFormatString = "<span class=\"cpb\"> {0}</span>", NumericPagerItemWrapperFormatString = "<span class=\"item\"> {0}</span>", CssClass = "pages"SeparatorHtml = "",IsPost=true })%></div> 
  25.     </div> 
  26.     </form> 
  27. </body> 
  28. </html> 

首先用到了Repeater,在mvc中Repeater的使用需要我们重写一下。如果想用for循环来实现也可以。我们继承Repeater然后重写OnLoad(EventArgs e) 方法得到Controller中放入ViewData的数据。我们添加一个公开的属性来取得对应ViewDate的值。

     Repeater重写:

  1. public string Key { getset; } 
  2.    //绑定数据  
  3.    protected override void OnLoad(EventArgs e) 
  4.    { 
  5.       this.DataSource = (base.Page as ViewPage).ViewData[this.Key]; 
  6.  
  7.       this.DataBind();     
  8.  
  9.       base.OnLoad(e); 
  10.    } 

这样就得到我们想要的MVC中的Repeater,因为Repeater必须放在runat="server"的form中所以这里action没有使用UrlHepler给我们提供的方法来写。
    我们把查询条件放入ViewData为了提交后的保存与显示。

  1. <input id="deptname" name=" deptname " type="text" value='<%=ViewData ["deptname"] %>'/> 

 后台保存:

  1. public ActionResult Dept (int? id) 
  2.         { 
  3.             ViewData ["deptlist"] = BindTable(id); 
  4.             return View(); 
  5.         } 
  6.         protected Webdiyer.WebControls.Mvc.PagedList<DepartmentInfo> BindTable(int? id) 
  7.         { 
  8.             int countPage = 0; 
  9.             List<DepartmentInfo> dt = db.SelectPageToList(GetSelectSearch(), 10, id ?? 1, out countPage); 
  10.             Webdiyer.WebC ontrols.Mvc.PagedList<DepartmentInfo> p = new Webdiyer.WebControls.Mvc.PagedList<DepartmentInfo>(dt, id ?? 1, 10, countPage); 
  11.             return p; 
  12.         } 
  13.         protected virtual SelectSqlSection GetSelectSearch() 
  14.         { 
  15.             SelectSqlSectio n select = db.GetSelectSqlSection(); 
  16.             select.OrderBy (DepartmentInfo.__ordernumber.Asc); 
  17.             if (!string.IsNullOrWhiteSpace(Request["deptname"])) 
  18.             { 
  19.                 select.Where(DepartmentInfo.__name.Like("%" + GetFormValue("deptname") + "%")); 
  20.             } 
  21.             if (!string.IsNullOrWhiteSpace(Request["deptcode"])) 
  22.             { 
  23.                 select.Where(DepartmentInfo.__code.Like("%" + GetFormValue("deptcode") + "%")); 
  24.             } 
  25.             return select; 
  26.         } 
  27.         private object GetFormValue(string name) 
  28.         { 
  29.             ViewData [name] = Request[name]; 
  30.             return ViewData[name]; 
  31.         } 

这里出现问题了,在查询时候的确可以获得表单的值,也可以这样保存显示,那么查询后点分页怎么办?分页可是a标签,难道让a标签也提交么?
OK,那么我们就来实现a标签的提交,我们就来给它分页时做提交功能。

因为每次分页都提交表单可能不是各个场景都需要,这里我对 PagerOptions类扩展了2个属性一个是 ispost(分页是否提交,默认是false) ,FormName(提交表单id,这里默认是 asp.net生成的form1)。

再来看怎么生成控件到页面,我们看PagerBuilder类,找到GeneratePagerElement方法,看最后一句String.Format ("<a href='{0}'>{1}</a>", url, item.Text));默认是生成只带连接的a标签,我们来改造他吧。

我们重新写这个方法名字就叫GeneratePagerElementPost,我们把a 标签的href执行一段脚本,把刚才那句替换为 String.Format("<a href='javascript:_PagePostSubmit (\"{0}\")'>{1}</a>", url, item.Text));

_PagePostSubmit这个js方法 就是用来点击a标签进行表单的提交的。那么我们看这个方法是怎么实现和生成到页面的。找到RenderPager方法,我们拉到方法最后看到如下代码,这里是添加脚本到客户端。 

  1. if (!string.IsNullOrEmpty(pagerScript)) 
  2.     pagerScript = "<script language=\"javascript\" type=\"text/javascript\">" + pagerScript + "</script>"

 在这个方面上面添加一下代码:首先我们判断下客户端是否需要每次分页都提交页面,然后加入我们的_PagePostSubmit这个js方法

  1. if (_pagerOptions.IsPost) 
  2.     { 
  3.      //通过 _pagerOptions.FormName获得用户选定表单名称,修改其 action,然后提交。 
  4.          pagerScript += " function _PagePostSubmit(href){ document.forms['" + _pagerOptions.FormName + "'].action=href;document.forms['" + _pagerOptions.FormName + "'].submit();}"
  5.     } 

 Ok,这样每个 a标签都能提交表单了,我们在页面添加下面代码就完成了查询+分页的实现

  1. <%=Html.Pager<DepartmentInfo> ((Webdiyer.WebControls.Mvc.PagedList<DepartmentInfo>)ViewData ["deptlist"], new PagerOptions() { PageIndexParameterName = "id"CurrentPagerItemWrapperFormatString = "<span class=\"cpb\"> {0}</span>", NumericPagerItemWrapperFormatString = "<span class=\"item\"> {0}</span>", CssClass = "pages"SeparatorHtml = "",IsPost=true })%> 

 把刚加的 IsPost属性变为 true,默认FormName=form1这里就没有在赋值了。

  • 下一篇资讯: C#.NET编码规范整理
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师