如何在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参数,最佳实践?
提前非常感谢。
首先,不应该使用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)
关于查询字符串的保护:https
和ssl
是大多数情况下使用的标准方式。
您可以创建两个方法:一个用于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查询来过滤数据。