在我的第一个真正的MVC应用程序中,我几乎每个页面都遇到了这个问题。我确定我错过了什么。
我正在处理的一个例子:
该页面有多个下拉列表(过滤器)和一个网格。 我有剃刀代码填充过滤器,网格最初使用数据的视图模型。一切都很好,代码很干净,页面加载完美。
现在,当我选择不同的过滤器选项时,这可能会改变其他一些下拉列表,并且肯定会更改网格中的数据。所以我正在对我的一个控制器方法进行ajax调用以获取新数据。然后我必须在JS中重建网格以及任何已更改的下拉列表。这只是重复Razor代码对初始页面加载的作用。
如果我在Razor中添加了类,属性等,那么这也必须在JS中重复。
必须有一种我缺少的模式。此时我甚至不关心是否使用ajax动态完成更新。如果我能用Razor完成所有这些操作,那么'回发'就可以了。任何可以避免这种大规模代码重复的事情。
答案 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>
或如果FilterModel
是DetailsModel
的成员:
<div id="filters">
@Html.Partial("Filters", Model.FilterModel)
</div>
当您需要在客户端更新它时,您可以再次请求该部分:
var filterUrl = "@Html.ActionLink("Filters")";
$(...).change(function(){
$("#filters").load(filterUrl);
});