如何在asp.net mvc 4中通过查询字符串参数过滤模型数据

本文关键字:字符串 查询 参数 过滤 数据 模型 asp net mvc | 更新日期: 2023-09-27 18:21:30

我正在创建一个视图,最初它会拉取/显示页面上的所有记录,后来在左侧有过滤器(文本框和复选框),用户可以从中过滤结果。

这是我的第一个mvc应用程序,所以我采用了下面提到的方法:

 // GET: /Search/
        public ActionResult Home(int page = 1)
        {

SearchController有一个Home方法,它是默认的,并将要查看的数据推送到网格中显示。过滤数据的控件包装在:

@using (Html.BeginForm("Home", "Search", FormMethod.Post))
        {

为此,我有

[HttpPost]
public ActionResult Home(Partner partner)

我的问题是:

a) 搜索需要是基于查询字符串的,这样用户就可以共享过滤后的结果,所以我们通过QS过滤模型数据(此处为合作伙伴)的最佳方式是什么,我知道我可以将整个模型传递给ActionResult,也可以接受ActionResult中的每个字段名称。

b) 你如何保护QS参数,最佳实践?

提前非常感谢。

如何在asp.net mvc 4中通过查询字符串参数过滤模型数据

首先,不应该使用HttpPost来查询过滤后的数据!POST用于执行命令(通常添加新数据,但也可用于其他功能),而GET用于查询。

您的Home操作应该稍作修改:

public ActionResult Home(int page = 1, Person person)
{
   // get the initial data - i assume that you using some context for it (you can use service as well)   
   using(var context = new DbContext())
   {
       var data = context.... //get the data here
       if(person != null)
       {
           data = data.Where(p => p.id == person.id).ToList(); //filter by id for example
       }
       //assuming your view gets a List as a model
       return View(data)
   }
}

我知道我可以将整个模型传递给ActionResult,也可以接受ActionResult 中的每个字段名称

我不会用你的展示模型作为过滤器。我宁愿创建一个新的过滤器模型,它将只包括您可以通过它们进行过滤的属性。例如,您的显示模型是Person对象的列表,您可以根据名称、年龄、id对它们进行筛选

public class PersonFilterModel
{ 
    public int Page //the one from your example
    public string Name {get;set;}
    public int? age {get;set;}
    public int? id {get;set;}
    //you can add properties for filter type (starts with, less than, bigger than)
}

所以你的行动将是

public ActionResult Home(PersonFilterModel filter)

如果过滤属性的数量不太大,您可以在不创建模型的情况下将它们逐个指定为操作参数:

public ActionResult Home(int page, string name, int? age, int? id)

关于查询字符串的保护:httpsssl是大多数情况下使用的标准方式。

您可以创建两个方法:一个用于GET,另一个用于POST

[HttpPost]
public ActionResult Home(Partner partner)
[ActionName("Home")]
[HttpGet]
public ActionResult GetHome(Partner partner)

当您在查询字符串中搜索和传递参数时,它将转到GetHome方法,但URL仍然相同。

我想首先回答问题b。我假设您希望防止用户使用查询字符串来过滤数据,以显示他们不应该看到的数据。我认为您不需要保护查询字符串。安全性应该在服务器端处理。您不应该在查询字符串中放入任何需要保护的内容,例如密码。

提供基于查询字符串进行过滤的能力非常强大,尤其是如果您以动态方式进行过滤。我最近在一个名为动态MVC的框架中做了这件事(http://dynamicmvc.com)。如果你有兴趣使用它,你可以通过nuget进行安装。它将提供您所要求的功能,而您几乎不需要任何编码。然而,如果你对动态MVC不感兴趣,你可以看看我是如何在CodePlex上做到这一点的(https://dynamicmvc.codeplex.com)

如果你只是想快速总结一下,下面是我的做法:

分析查询字符串以查找模型的任何相关属性。您可以使用反射来获取属性名称。一旦拥有了相关的属性,就可以使用动态linq通过linq-to-entities查询来过滤数据。