提交部分视图的表单时刷新父视图

时间:2011-09-20 00:43:59

标签: asp.net-mvc-3 razor partial-views

我正在研究使用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>

2 个答案:

答案 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的正确方法