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> ;< div id =“pager”>< / div>).您还应该毫不怀疑地使用相对较长的代码来分析来自jqGrid的高级搜索功能并生成或对数据模型的相应请求的过滤器.只需实施一次.在我的实现中代码也比较复杂,但它已经写了一次,它可以工作,它可以用于所有新的jqGrids. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何使用MVC 4制作提交按钮
- 部署DotNetNuke并将ASP.NET应用程序分开 – 可能的问题?
- asp.net-mvc – 将数据发布回ASP.NET MVC子操作
- asp.net – C#中的嵌套中继器
- asp.net-mvc-3 – mvc dropdownlistfor没有标记为必需但仍然
- asp.net-mvc – 在MVC 3中跨请求保持查询字符串
- asp.net-mvc – 应该在ASP.NET MVC应用程序中缓存发生在哪里
- asp.net-mvc – 使用Automapper映射嵌套类
- asp.net – 发布时母版页无法加载类型错误
- MVC ASP.NET – 手动授权某人并通过表单身份验证保留授权
- asp.net – SqlDataSource在变量后面插入代码
- asp.net-mvc-3 – 在MVC中的Http Post之后渲染相
- asp.net-mvc-5 – MVC 5 – 向用户添加声明
- asp.net-mvc – App_Web _ * .dll中的System.Nul
- ASP.Net(IIS 7.5)查询没有用户凭据的Active Dire
- 像ValidationGroup这样的ASP.NET使用JQuery验证插
- asp.net-mvc – 在Razor View中重命名mvc模型对象
- asp.net-mvc – 使用RadioButtons的可空值布尔的
- yield在WCF中的错误使用——99%的开发人员都有可
- .net – Autofac和IDisposable界面