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

时间:2014-09-11 16:55:59

标签: c# asp.net asp.net-mvc asp.net-mvc-4

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

这是我的第一个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,或者我可以接受AcitionResult中的每个字段名称。

b)你如何保护QS参数,这是最好的做法?

提前多多感谢。

3 个答案:

答案 0 :(得分:1)

首先,您不应该使用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,或者我可以接受AcitionResult中的每个字段名称

我不会将您的显示模型用作过滤器。我宁愿创建新的过滤器模型,它只包含您可以过滤的属性。例如,您的显示模型是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是大多数情况下使用的标准方法。

答案 1 :(得分:0)

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

[HttpPost]
public ActionResult Home(Partner partner)

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

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

答案 2 :(得分:0)

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

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

如果你只是想要一个快速摘要,我就是这样做的:

解析模型的任何相关属性的查询字符串。您可以使用反射来获取属性名称。 获得相关属性后,可以使用动态linq通过linq to entities查询过滤数据。