在.NET MVC中添加URL过滤器的最佳方法

6
我会尽可能简洁地表达。
网页包含一个允许过滤和排序的表格。
过滤和排序的更改应反映在URL中,以便用户可以收藏或分享过滤视图。
问题是:如何有效地允许所有排序和筛选语法成为URL的一部分,并在不编写大量自定义代码的情况下轻松解释/使用它?
我进行了一些研究,发现了OData URI约定,并且我喜欢他们的做法。http://www.odata.org/developers/protocols/uri-conventions 更多研究显示,MVC 4 Web API允许使用该约定通过返回IQueryable。这看起来很棒,除了一个部分...... 我目前没有实现RESTful API,而这似乎是唯一的工作方式。那么我如何使用类似于OData的东西并仍然返回View或PartialView?是否有东西将OData URI约定解析为C#对象?
如果有人对这个问题有任何见解或建议,我都听取。

当您提到MVC 4 Web Api时,您是指Asp.Net的吗?如果是这样,URL参数将自动传递给操作方法,并尝试根据操作方法签名中声明的类型进行解释。 - Chris Carew
是的,这与ASP.NET MVC有关,我知道如何在操作方法中使用参数。问题是,当你开始将复杂的过滤器放入URL时,事情变得棘手。我希望有一个约定/框架可以为我处理它。MVC 4的Web API非常接近为我处理它,但它专注于数据API,而我需要常规视图和PartialView。 - Zifik
你是如何生成你的过滤器列表的呢?它们存储在数据库中吗?还是从数据集动态生成的?或者是硬编码到页面中的? - Bobson
Telerik Grid for MVC 使用类似的东西。这是一个开源项目,请查看他们的代码:http://www.telerik.com/products/aspnet-mvc/grid.aspx http://telerikaspnetmvc.codeplex.com/ - LeffeBrune
2个回答

0

我会考虑使用自定义模型绑定。这里有一个很好的概述:http://weblogs.asp.net/nmarun/archive/2010/02/25/asp-net-mvc-model-binding.aspx

通常用于带表单的POST请求,但也可以用于GET请求。

基本上,你的方法应该是:

  1. 创建一个新的模型类,将筛选/排序参数作为属性:

    public class TableParameters {
         public string TableFilter { get; set; }
    }
    
  2. 在您的控制器操作中,将该模型作为参数添加:

     public ActionResult TableAction(TableParameters parameters) { /* 操作逻辑 */ }
    
  3. 通过以下方式在URL中设置您的参数:

     /Controller/TableAction?TableFilter=[your-filter-string]
    

您的操作中的参数对象将具有通过查询字符串传递的值填充的属性。


同样值得注意的是模型绑定的安全性方面。http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx - infl3x

0
关于您问题中的URL约定部分,我认为您已经通过OData回答了自己的问题。至于将这些数据转换为C#对象,我会采用以下方法:
使用操作过滤器来解释URL参数并将它们解析为C#对象。在您的操作过滤器中,将URL参数添加到路由数据中,C#对象将在您的操作中可用。
请参考Telerik MVC网格,他们使用GridAction操作过滤器,几乎可以实现您所要求的功能。 ASP.NET MVC Pass object from Custom Action Filter to Action

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接