您所做的是可行的,但正如@ps2goat 指出的那样,如果 URL 中有太多 GET 参数,您可能会遇到问题。
但正确的答案取决于过滤器的使用方式。用户会经常更换过滤器还是很少更换过滤器?如果希望用户浏览您的应用程序并且很少更改过滤器,我建议您使用另一种方法,而不是将参数作为 GET 参数包含在 URL 中,因为:
- 正如@ps2goat 指出的那样,如果您的 URL 的总长度变得太长,您可能会遇到问题。
- 您可能会遇到用户体验问题。如果用户为页面添加了书签,然后随后更改了他的过滤器,并使用书签返回到之前的页面,那么他的过滤器将被还原,这可能不是他所期望的。
- 它看起来不会很漂亮。您网站上的所有网址看起来都像
/controller/action/?YearSelected=2014&QuarterSelected=1&Parameter3=2&Parameter4=8
,这也可能会产生您需要处理的 SEO 问题。
在这种情况下,我建议您考虑使用 cookie 或将用户的过滤器保存在服务器上。(但最好不要在 Session 中,因为这会给您的应用程序带来可伸缩性问题)。如果您使用 cookie,用户的过滤器将自动在每个请求上可用于您的控制器操作,因为 cookie 将与每个请求一起发送。(这当然也是在考虑使用哪种策略时要记住的事情。如果您有大量 cookie 数据,这将减慢应用程序的感知响应速度,因为 cookie 数据必须与每个请求一起发送到您的服务器。因此请尽量减少您的 cookie 数据)
另一方面,如果您希望用户在同一页面上经常甚至多次更改过滤器,您可以考虑使用 jQuery 对您的 MVC 控制器进行异步 POST,使用 JSON 检索必要的数据,并更新看法。这实际上并不像听起来那么困难。
要实现它,您需要做的是在您的页面上创建一个 Javascript 函数,该函数将您的参数提交给您的控制器操作。您也可以将数据作为 JSON 发送到控制器操作。像这样的东西可以工作:(未经测试的代码)
<script>
function submitFilters() {
var parameters = {
parameter1: $('#parameter1').val(),
parameter2: $('#parameter2').val(),
...
};
$.ajax('@Url.Action("SomeController", "SomeAction")', {
contentType: 'application/json',
data: JSON.stringify(parameters),
success: function(data) {
alert('Received data back from server. Ready to update the view.');
}
};
}
</script>
然后你会连接过滤器(单选按钮、下拉菜单等)来调用方法submitFilters
。
只要属性名称匹配,MVC 就会自动将从客户端接收到的 JSON 数据转换为您的 C# ViewModel。然后您可以在服务器上执行您需要的任何查询和过滤,然后将数据作为操作的结果发回。(伪代码)
public ActionResult SomeAction(MyViewModel vm)
{
var data = SomeRepository.GetData(vm.Parameter1, vm.Parameter2, ...);
return Json(data);
}
然后你只需要在收到数据时更新视图。您最好为此使用模板引擎,但这当然不是必需的。
这只是您如何做到这一点的粗略示例。通常我会创建一个Knockout View Model 来封装它。但这应该让你开始。