asp.net-mvc-2 – 使用ASP.NET MVC 2时更好地保留过滤选项的指南

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-2 – 使用ASP.NET MVC 2时更好地保留过滤选项的指南前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个ASP.NET MVC 2应用程序,它部分允许用户过滤数据并在JQGrid中查看该数据.

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

用户可以更改过滤器并按下提交按钮以获得不同的结果 – 然后由(HttpPost)ViewResult操作拾取,该操作采用过滤器模型 – 由另一个模型绑定器重构并导致网格外壳更新.

所以我有:

FilterModel
表示用户所需的过滤特征

FilterModelEditorTemplateSubmissionBinder:DefaultModelBinder – 用于将用户提供的请求信息转换为适当的FilterModel实例,将其过滤特性更改为相应的FilterModel实例.

FilterModelStringRepresentationBinder:IModelBinder – 用于从JQGrid GET数据请求转换编码过滤器,以便正确请求最终执行查询并返回相关数据的服务.

ViewResult Index() – 构造一个默认过滤器,配置网格规范并返回视图以呈现过滤器的编辑器模板和网格外壳.

[HttpPost] ViewResult Filter(FilterModel过滤器) – 获取新的过滤器特征并返回与Index()相同的视图.使用FilterModelEditorTemplateSubmissionBinder绑定过滤器模型.

JsonResult GetData(FilterModel过滤器,字符串sidx,字符串sord,int页面,int行) – 从JQGrid调用以检索数据.使用FilterModelStringRepresentationBinder绑定过滤器模型.

作为一个复杂功能,我的过滤器模型包含一个从项目集合中选择单个值的选项.这个集合是从服务请求中检索的,我不想在每次显示过滤器时都继续查询这些数据,如果属性为null,我现在得到它,然后包含隐藏在编辑器模板中的选项和编码字符串表示.然后由相关的模型装订器重构这些选项.

虽然这种方法有效但我不禁觉得我必须重新发明viewstate才能维护我的过滤器和包含的选项.由于我是ASP.NET MVC的新手,但我对经典的ASP和ASP.NET Web Forms非常满意,我认为我会把它扔出去寻求评论和指导,以找到更接近MVC模式的方法.

解决方法

在我看来,最好的方法是将一些为jqGrid提供纯数据的动作与其他控制器动作分开.这种面向jqGrid的动作可以有如下原型:
JsonResult GetData(string filter,string sidx,string sord,int page,int rows)

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

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

ASP.NET MVC站点的视图可以包含jqGrids的空数据,并且只有正确的URL,并且可能生成HTML代码取决于站点中的用户权限.每个页面都会根据对服务器的对应请求(对相应的GetData操作的请求)填充jqGrids的数据.

您可以使用HTTP GET获取最佳数据缓存的数据.数据缓存是单独讨论的主题.如果执行此操作,则应在jqGrid的定义中使用prmNames:{nd:null}以删除唯一的nd参数,并将默认情况下添加的时间戳添加到每个GET请求.要完全控制服务器端的数据缓存,您可以例如添加服务器响应的HTTP头,“Cache-Control”设置为“max-age = 0”和“ETag”头,其值基于响应中返回的数据.您应该测试来自客户端的请求是否具有“If-None-Match”HTTP标头,其值为“ETag”,以对应客户端上缓存的数据.然后,您应该验证服务器(在数据库中)的当前数据是否已更改,如果没有更改,则生成具有空体的响应(将SuppressEntityBody设置为true)并返回“304 Not Modified”状态代码(HttpStatusCode) .NotModified)而不是默认的“200 OK”.更详细的解释要长得多.

如果您不希望优化站点以缓存jqGrids的HTTP GET数据,则可以使用HTTP POST或不使用prmNames:{nd:null}参数.

JsonResult GetData(字符串过滤器,int行)中的代码并不是很缺乏原因.您应该从过滤器字符串反序列化JSON数据,然后构造对数据模型的请求取决于您使用的数据访问方法(LINQ to sql,实体模型或带sqlDataReader的sqlCommand).因为你已经实现了这部分,所以讨论这部分是没有意义的.

可能我的建议的主要部分是使用控制器动作的明确分离,这些动作为所有jqGrids提供数据,并使用空数据使用MVC视图(仅具有< table id =“list”>< / table&gt ;< div id =“pager”>< / div>).您还应该毫不怀疑地使用相对较长的代码来分析来自jqGrid的高级搜索功能生成或对数据模型的相应请求的过滤器.只需实施一次.在我的实现中代码也比较复杂,但它已经写了一次,它可以工作,它可以用于所有新的jqGrids.

原文链接:https://www.f2er.com/aspnet/249218.html

猜你在找的asp.Net相关文章