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

时间:2012-03-22 22:41:32

标签: asp.net-mvc filter partial-views odata asp.net-web-api

我会尝试尽可能简洁。

  • 网页包含一个允许过滤和排序的表
  • 对过滤和排序的更改应反映在网址中,以便用户可以添加书签或共享过滤后的视图。

问题是:什么是允许所有排序和过滤器语法成为URL的一部分并在服务器上轻松解释/使用它而无需编写一堆解释它的自定义代码的有效约定? / p>

我一直在做一些研究,我遇到了OData URI约定,我喜欢他们做事的方式。 http://www.odata.org/developers/protocols/uri-conventions

更多研究表明,MVC 4 Web API允许通过返回IQueryable来使用该约定。除了一个部分之外,这看起来很棒...我现在还没有实现RESTful API,而这似乎与它有关。那么我怎样才能使用像OData这样的东西并仍然返回一个View或PartialView?是否有能够将OData URI约定解析为C#对象的东西?

如果有人对此问题或建议有任何见解,我会全力以赴。

2 个答案:

答案 0 :(得分:0)

关于你问题的url约定部分,我想你已经用OData回答了你自己的问题。至于将这些数据转换为C#对象,我将使用以下方法:

使用动作过滤器来插入url参数并将它们解析为c#对象。 在您的操作过滤器中,将url参数添加到路径数据中,c#对象将在您的操作中可用。

ASP.NET MVC Pass object from Custom Action Filter to Action

看一下Telerik MVC网格,他们使用GridAction动作过滤器来完成你所要求的几乎所有。

答案 1 :(得分:0)

我会看一下自定义模型绑定。可以在此处找到一个很好的概述:http://weblogs.asp.net/nmarun/archive/2010/02/25/asp-net-mvc-model-binding.aspx

它通常用于带表单的POST请求,但没有理由不能将它用于GET请求。

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

  1. 使用过滤器/排序参数作为属性创建一个新的Model类:

    public class TableParameters {
         public string TableFilter { get; set; }
    }
    
  2. 在Controller的操作中,将模型添加为参数

     public ActionResult TableAction(TableParameters parameters) { /* Action logic */ }
    
  3. 通过说明

    在URL中设置参数
     /Controller/TableAction?TableFilter=[your-filter-string]
    
  4. 操作中的参数对象将使用查询字符串中的值填充属性。