【问题标题】:How to return model state from child action handler in ASP.NET MVC如何从 ASP.NET MVC 中的子操作处理程序返回模型状态
【发布时间】:2010-06-03 17:51:35
【问题描述】:

在我的博客引擎中,我有一个显示博客内容的控制器操作,在该视图中,我调用 Html.RenderAction(...) 来呈现“CreateComment”表单。当用户发表评论时,该帖子由评论控制器(而不是博客控制器)处理。

如果评论数据有效,我只需将重定向返回到博客页面的 URL。

如果评论数据无效(例如评论正文为空),我想将带有错误信息的 ViewData 返回到博客控制器,并通过博客视图返回到 CreateComment 操作/视图,以便我可以显示哪些字段是不好。

当启用 Javascript 时,我通过 AJAX 可以正常工作,但现在我正在处理可能禁用 Javascript 的情况。

如果我从评论控制器返回 RedirecToAction 或 Redirect,模型状态信息就会丢失。

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案1】:

    您可以在执行重定向之前将您的 ModelState 或 ViewData(包含 ModelState)存储在 TempData 中,然后再获取它:

    // In your CreateComment action before redirect
    if (!ModelState.IsValid)
    {
        TempData["ViewData"] = ViewData;
    }
    
    // In your Blog controller's action to which you redirected
    if (null != TempData["ViewData"])
    {
        ViewData = (ViewDataDictionary)TempData["ViewData"];
    }
    

    或者,您可以创建自己的 RouteData,设置“控制器”和“动作”,清除响应,获取 this.Context 并将其转储到新的 RequestContext 中,使用 ControllerBuilder 使用您创建的路由数据创建新的 IController之前,然后重写您的路径并使用新的请求上下文执行控制器。在那里的某个地方你必须转储你的 ModelState 才能结转。没试过,感觉有点过头了。

    【讨论】:

      【解决方案2】:

      如果浏览器中启用了Javascript,为什么不在执行AJAX调用时在视图中设置一点状态信息?然后,当您发布到博客控制器时,博客控制器会知道您的评论是否通过 AJAX 处理,或者博​​客控制器是否必须自己处理。

      您的博客控制器方法必须接受一个包含新创建的评论信息的 ViewModel 对象。

      【讨论】:

        【解决方案3】:

        使用 MVCContrib 中的此过滤器在重定向之前将错误添加到 TempData:

        http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-12
          • 2011-01-16
          • 2011-01-23
          • 2010-12-07
          • 2012-12-15
          • 2016-04-04
          相关资源
          最近更新 更多