2

在我的第一个真正的 MVC 应用程序中,我几乎在每一页都遇到了这个问题。我确定我错过了一些东西。

我目前正在处理的一个例子:

该页面有多个下拉列表(过滤器)和一个网格。我有填充过滤器的剃须刀代码,网格最初使用数据的视图模型。一切都很好,代码很干净,页面加载完美。

现在,当我选择不同的过滤器选项时,这可能会更改其他一些下拉菜单,并且肯定会更改网格中的数据。因此,我正在对我的一个控制器方法进行 ajax 调用以获取新数据。然后我必须在 JS 中重建网格以及任何已更改的下拉菜单。这只是复制 Razor 代码为初始页面加载所做的工作。

如果我在 Razor 中添加了类、属性等,这也必须在 JS 中复制。

一定有一个我错过的模式。在这一点上,我什至不在乎更新是否使用 ajax 动态完成。如果我可以在 Razor 中通过“回发”完成所有这些工作,那很好。任何可以避免这种大量代码重复的方法。

4

1 回答 1

2

您可以创建一个PartialView与您的初始页面加载完全相同的内容。

public ViewResult Details(int id)
{
    DetailsModel model = new DetailsModel...

    return View(model);
}

在上述情况下,您可能FilterModel是 的成员DetailsModel,无论哪种方式,如果您需要处理一些关于要呈现的内容的数据,您都可以创建一个部分操作方法:

public PartialViewResult Filters(int someParams...)
{
    FilterModel model = new FilterModel...
    return PartialView("Filters"
}

然后像这样从您的视图中调用它:

<div id="filters">
    @Html.Action("Filters", someParams)
</div>

或者这个如果FilterModel是成员DetailsModel

<div id="filters">
    @Html.Partial("Filters", Model.FilterModel)
</div>

当您需要在客户端更新它时,您可以再次请求该部分:

var filterUrl = "@Html.ActionLink("Filters")";

$(...).change(function(){
    $("#filters").load(filterUrl);
});
于 2012-08-28T13:18:55.783 回答