代码之家  ›  专栏  ›  技术社区  ›  Stephen Newman

使用ASP.NET MVC 2时保留筛选选项的更好方法指南

  •  2
  • Stephen Newman  · 技术社区  · 15 年前

    我有一个ASP.NETMVC2应用程序,它允许用户过滤数据并在JQGrid中查看这些数据。

    目前,这包括一个控制器,它初始化我的过滤器模型,并配置我希望如何显示我的网格。视图和局部视图使用此信息来显示过滤器和网格外壳。我使用编辑器模板来显示我的过滤器。JQGrid使用JsonResult控制器操作(GET)来检索过滤器的结果(通过添加网格提供的分页,GET请求只返回一页数据)。网格用于请求数据的Uri包含作为RouteValue的筛选器模型,并且当前包含筛选器当前状态的字符串表示。自定义IModelBinder用于将此表示转换回filter模型类的实例。

    用户可以更改过滤器并按下submit按钮以获得不同的结果,然后(HttpPost)ViewResult操作将获取过滤器模型,该过滤器模型由另一个模型绑定器重新构建,并导致网格shell更新。

    所以我有:

    过滤器模型 表示用户所需的过滤特性

    FilterModelEditorTemplateSubmissionBinder:默认ModelBinder

    -用于从JQGrid GET数据请求转换编码的过滤器,以便对最终执行查询并返回相关数据的服务发出正确的请求。

    ViewResult索引()

    [HttpPost]ViewResult筛选器(FilterModel筛选器) -采用新的筛选器特征并返回与Index()相同的视图。使用FilterModelEditorTemplateSubmissionBinder绑定筛选器模型。

    JsonResult GetData(FilterModel filter,string sidx,string sord,int page,int rows) -从JQGrid调用以检索数据。使用FilterModelStringRepresentationBinder绑定筛选器模型。

    尽管这种方法可行,但我还是忍不住觉得我必须重新设计viewstate,以便维护我的过滤器和包含的选项。由于我对ASP.NETMVC还不熟悉,但对经典的ASP和ASP.NETWeb表单非常满意,我想我应该把这个放在那里发表评论和指导,以便找到一种更符合MVC模式的方法。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Oleg    15 年前

    在我看来,最好的方法是将一些为jqGrid提供纯数据的操作与其他控制器操作分开。这种面向jqGrid的操作可以有如下原型:

    JsonResult GetData(string filter, string sidx, string sord, int page, int rows)
    

    我个人更喜欢将此部分实现为WCF服务,并将此WCF服务作为同一ASP.NET站点的一部分。一般来说,这更多的是口味的问题,并取决于您的其他项目要求。

    您的ASP.NET站点的这一部分可以实现您需要的用户身份验证,并且可以像控制器的其他操作一样使用单元测试进行测试。

    空数据 对于jqGrids,只有正确的url和可能生成的HTML代码取决于用户在站点中的权限。每一页都会 根据对应于服务器的请求填充jqGrids的数据 (向相应的 GetData

    您可以使用httpget获取数据以获得最佳的数据缓存。数据的缓存是另一个讨论的主题。如果你这样做,你应该使用 prmNames: { nd:null } 在jqGrid的定义中删除unique nd "Cache-Control" "max-age=0" "ETag" "If-None-Match" 值为的HTTP头 “ETag” 共同响应客户端上缓存的数据。然后,您应该验证服务器上(数据库中)的当前数据是否已更改,如果没有更改,则使用 empty 阀体(套) SuppressEntityBody 返回“304未修改”状态码( HttpStatusCode.NotModified )而不是默认的“200OK”。更详细的解释要长得多。

    如果您不想优化您的站点以缓存jqGrids的httpget数据,您可以使用httppost,也可以不使用 prmNames:{nd:null} 参数。

    里面的代码 JsonResult GetData(string filter, string sidx, string sord, int page, int rows) 不是很缺乏理由。您应该从 filter 字符串,然后构造对数据模型的请求,这取决于您使用的数据访问方法(LINQ到SQL、实体模型或 SqlCommand SqlDataReader ). 因为您已经实现了这一部分,所以讨论这一部分毫无意义。

    空的 数据(只有 <table id="list"></table><div id="pager"></div> ). 您还应该毫无疑问地拥有一个相对较长的代码,用于分析来自jqGrid的高级搜索特性的过滤器,并生成或对应于您的数据模型的请求。就执行一次。在我的实现中,代码也相对复杂,但它已经编写了一次,它可以工作,并且可以用于所有新的jqGrids。

        2
  •  0
  •   Nealv    15 年前

    我做过一次,非常简单。

    伪代码:

    控制器

    [HttpGet]
    public ActionResult getList(int? id){
        return PartialView("Index", new ListViewModel(id??0))
    }
    

    视图模型

    public class ListViewModel{
    //ObjectAmountPerPage is the amount of object you want per page, you can modify this as //parameter so the user
    //can choose the amount
    
    public int ObjectAmountPerPage = 20 //you can make this into a variable of any sort, db/configfile/parameter
    
    public List<YourObjectName> ObjectList;
    public int CurrentPage;
        public ListViewModel(id){
            Currentpage = id;
            using (MyDataContext db = new MyDataContext()){
                ObjectList = db.YourObjectName.OrderBy(object=>object.somefield).getListFromStartIndexToEndIndex(id*ObjectAmountPerPage ,(id*ObjectAmountPerPage) +20).toList();
            }
        }
    }
    

    现在创建RenderPartial:

    <@page inherit="IEnumerable<ListViewMode>">
    <%foreach(YourObjectName object in Model.ObjectList){%>
     Create a table with your fields
    <%}%>
    

    并创建一个实现Jquery、其他组件和partialView的视图

    查看

    <javascript>
        $(function(){
            $("#nextpage").click(function(){
              (/controller/getlist/$("#nextpage").val(),function(data){$("#yourlist").html = data});
            });
        });
    </javascript>
    <div id="yourlist">
        <%=Html.RenderPartial("YourPartialView", new ListViewModel())%>
    </div>
    <something id="nextpage" value"<%=Model.CurentPage+1%>">next page</something>
    

    我希望这有帮助,这是根据MVC-mv-mv-c原则;) 模型视图-(modelview)-控件

    推荐文章