【问题标题】:Refreshing parent view when a partial view's form is submitted提交部分视图的表单时刷新父视图
【发布时间】:2011-09-20 00:43:59
【问题描述】:

我正在研究使用 Razor 在 MVC3 中使用局部视图,我得到了要渲染的局部视图,它工作正常。 不过,我想做的是在提交部分视图时刷新父视图。

在我的父视图中渲染部分视图的代码

<div id="mydiv">
@{ Html.RenderAction("Add", "Request"); }
</div>

父视图的操作很简单,

public ActionResult Index()
{
  List<obj> reqs = //some query
  return View(reqs);
}

在我的部分视图中,我有 get 操作:

public ActionResult Add()
{
  AddRequestViewModel vm = new AddRequestViewModel();
  //set some stuff on the VM here
  return PartialView(vm);
}

在局部视图调用的post action中,如果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: partial 的模型不同,因为它包含用于选择的数据,这些数据来自 db,这就是我尝试 RenderAction 的原因,但我不确定是否有其他方法可以做到这一点。

【问题讨论】:

  • 在这种情况下,我看不出您在哪里需要 Ajax 请求。

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


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

    可能不应该以这种方式使用 RenderAction。

    使用 Html.RenderAction 时,将向服务器发送一个新的/单独的请求。您还有机会从 db 或其他地方加载一些数据以显示给客户端。此外,您可以将 OutputCache 应用于此操作。这通常是全局缓存的方式。

    在这里,您正在对服务器进行 POST。要么直接在这里放一个元素,要么使用局部视图来做 Post。并在对应的action中,做一个RedirectToAction。

    是否使用 ajax 不是重点。我的意见更多是关于使用 RenderAction 的正确方法

    【讨论】:

    • 我正在使用 Html.RenderAction 因为我确实需要从数据库加载一些数据以显示给客户端。部分视图与父页面的视图具有不同的模型。我想以正确或更被接受的方式做事;我只是不确定那是什么。
    • 父视图无法完成数据加载的任何原因?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2013-12-04
    相关资源
    最近更新 更多