2

我正在研究我们公司的 ASP.NET MVC 4 项目。它是基于收入的应用程序,它在应用程序的每个控制器和操作处都有一些过滤器。它们像一些过滤器一样是年和季度。对于这些过滤器更改,我使用了创建基础模型(它包含这些过滤器值),并且从这个基础模型继承的所有其他模型都在 @layout 视图中使用。过滤器的每次更改都应更新视图。布局视图中的基本模型是这样的

public class BaseModel
{
 public string YearSelected{ get; set;}
 public string QuarterSelected{ get; set;}
}

和其他模型继承自这个 BaseModel

public class RevenueModel:BaseModel
{
 // other stuff
}


对于所有这些我通过参数发送的东西。似乎现在参数是增加要求是添加更多参数的更改
1.我想知道处理正确的方法和如果方法不足建议我处理此参数更改的最佳方法.

2.在用户界面(视图)中,
当用户通过选中单选按钮更改视图并单击应用过滤器按钮时,我正在使用 jquery 来处理此问题,

window.href='Url Action with new Parameters';
window.href='@Url.Action("SomeAction","Controller",new{ // those all parameters } ';

当按钮单击window.href 会自动调用并更新我想知道的视图
这个方法Robust 吗?建议我处理这种情况的最佳方法。

“如果我使用 jquery 调用操作并为调用控制器操作使用大量参数,我需要一个答案”

4

1 回答 1

3

您所做的是可行的,但正如@ps2goat 指出的那样,如果 URL 中有太多 GET 参数,您可能会遇到问题。

但正确的答案取决于过滤器的使用方式。用户会经常更换过滤器还是很少更换过滤器?如果希望用户浏览您的应用程序并且很少更改过滤器,我建议您使用另一种方法,而不是将参数作为 GET 参数包含在 URL 中,因为:

  1. 正如@ps2goat 指出的那样,如果您的 URL 的总长度变得太长,您可能会遇到问题。
  2. 您可能会遇到用户体验问题。如果用户为页面添加了书签,然后随后更改了他的过滤器,并使用书签返回到之前的页面,那么他的过滤器将被还原,这可能不是他所期望的。
  3. 它看起来不会很漂亮。您网站上的所有网址看起来都像/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 来封装它。但这应该让你开始。

于 2014-02-07T14:04:34.887 回答