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

Posted

技术标签:

【中文标题】在 .NET MVC 中向 URL 添加过滤器的最佳方法【英文标题】:Best way to add filter to URL in .NET MVC 【发布时间】:2012-04-07 13:35:06 【问题描述】:

我会尽量做到简洁。

网页包含允许过滤和排序的表格 对过滤和排序的更改应反映在 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 参数会自动传递给操作方法,并会尝试将其解释为您在操作方法的签名中声明的类型。 是的,因此我们了解了 ASP.NET MVC,是的,我知道参数如何与操作方法一起使用。问题在于,当您将复杂的过滤器放入 URL 时,事情会变得棘手。我希望有一个可以为我处理它的约定/框架。 MVC 4 的 Web API 非常接近为我处理它,但它专注于数据 API,我需要常规 Views 和 PartialVies 您是如何首先生成过滤器列表的?它们是否存储在数据库中?从数据集中动态生成?硬编码到页面中? Telerik Grid for MVC 使用类似的东西。这是一个开源项目,看看他们的代码:telerik.com/products/aspnet-mvc/grid.aspxtelerikaspnetmvc.codeplex.com 【参考方案1】:

至于您问题的 url 约定部分,我认为您已经用 OData 回答了您自己的问题。至于将这些数据放入 C# 对象中,我将使用以下方法:

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

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

看看 Telerik MVC 网格,他们使用 GridAction 动作过滤器,几乎可以满足您的要求。

【讨论】:

【参考方案2】:

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

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

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

    使用您的过滤器/排序参数作为属性创建一个新的模型类:

    public class TableParameters 
         public string TableFilter  get; set; 
    
    

    在 Controller 的 Action 中,将模型添加为参数

     public ActionResult TableAction(TableParameters parameters)  /* Action logic */ 
    

    通过以下方式在 URL 中设置参数:

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

您的操作中的参数对象将使用查询字符串中的值填充属性。

【讨论】:

同样值得关注模型绑定的安全方面odetocode.com/blogs/scott/archive/2012/03/11/…

以上是关于在 .NET MVC 中向 URL 添加过滤器的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 中向客户端发送 XML 文件

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 25. 过滤器

如何在 jQuery $.ajax() 发布请求中向 MVC 控制器方法发送模型

在 ASP.NET MVC 中向控制器传递多个参数;此外,在 LINQ-to-SQL 中生成动态查询

在 servlet 过滤器中向请求添加 HTTP 标头

在 ASP.NET Core MVC 中将自定义查询参数添加到操作 URL