我正在研究使用Razor在MVC3中使用部分视图,并且我得到了部分视图来渲染并且它工作正常。 但是,我想要做的是在提交部分视图时刷新父视图。
我父视图中用于呈现部分视图的代码
<div id="mydiv">
@{ Html.RenderAction("Add", "Request"); }
</div>
父视图的操作很简单,
public ActionResult Index()
{
List<obj> reqs = //some query
return View(reqs);
}
在我的部分视图中,我有以下行动:
public ActionResult Add()
{
AddRequestViewModel vm = new AddRequestViewModel();
//set some stuff on the VM here
return PartialView(vm);
}
在部分视图调用的post动作中,如果modelstate无效,return PartialView(vm)
如果有效,我希望刷新父视图和部分视图。
我尝试了RedirectToAction,但是在部分调用的动作中无法调用,显然,我尝试了return Index();
,但是这会导致用于渲染局部视图的代码出现问题,
Exception Details: System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Collections.Generic.List'1[DatRequests.Models.ReqRequest]', but this dictionary requires a model item of type 'DatRequests.ViewModels.AddRequestViewModel'.
有关如何执行此操作的任何建议将不胜感激。页面的目的是显示元素列表,部分包含一个表单,用于向列表中添加新元素。
Edit:
部分的模型不同,因为它包含选择的数据,这是来自db,这就是我尝试使用RenderAction的原因,但我不确定是否还有其他方法可以做到这一点。 / p>
答案 0 :(得分:1)
正常提交部分视图时,您将其提交给某个控制器操作。您可以使用普通请求或AJAX请求提交它。如果您使用普通请求,则可以执行标准重定向到POST控制器操作中的Index
,该操作将处理表单提交。如果您使用AJAX,则可以返回指向要重定向的URL的JSON结果:
[HttpPost]
public ActionResult Foo(MyViewModel model)
{
if (!ModelState.IsValid)
{
return PartialView(model);
}
return Json(new { url = Url.Action("Index") });
}
并在你的AJAX成功回调中:
success: function(result) {
if (result.url) {
// we have a success
window.location.href = result.url;
} else {
// invalid modelstate => refresh the partial
$('#mydiv').html(result);
}
}
答案 1 :(得分:1)
可能不应该以这种方式使用RenderAction。
使用Html.RenderAction时,会向服务器发送新的/单独的请求。并且您还有另一个机会从db或其他地方加载一些数据以显示给客户端。此外,您可以将OutputCache应用于此操作。这通常是进行全局缓存的方式。
这里你正在对服务器进行POST。要么直接在这里放置一个元素,要么使用局部视图来做Post。并在相应的操作中,执行RedirectToAction。
用ajax做的不是重点。我的观点更多是关于使用RenderAction的正确方法