我正在创建一个视图,该视图最初拉取/显示页面上的所有记录,然后在左侧有过滤器(文本框和复选框),用户可以从中过滤结果。
这是我的第一个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参数,这是最好的做法?
提前多多感谢。
答案 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)
关于查询字符串的保护:https
和ssl
是大多数情况下使用的标准方法。
答案 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查询过滤数据。