你如何避免编写重复的JavaScript和Razor代码?

时间:2012-08-28 13:14:45

标签: asp.net-mvc

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

我正在处理的一个例子:

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

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

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

必须有一种我缺少的模式。此时我甚至不关心是否使用ajax动态完成更新。如果我能用Razor完成所有这些操作,那么'回发'就可以了。任何可以避免这种大规模代码重复的事情。

1 个答案:

答案 0 :(得分: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"
}

然后从你的View中调用它:

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

或如果FilterModelDetailsModel的成员:

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

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

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

$(...).change(function(){
    $("#filters").load(filterUrl);
});