带有 PartialViews 的无效 ModelState

发布于 2024-12-11 23:11:30 字数 886 浏览 0 评论 0原文

我有以下操作,

[GET("Foo")]
public virtual ActionResult Foo()
{
    return View(new FooViewModel());
}

此操作的视图

@{ Html.RenderAction(MVC.FooBar.AddFoo()); }

使用控制器操作

[ChildActionOnly]
[GET("Foo/Add")]
public virtual ActionResult AddFoo()
{
    var viewModel = new AddFooViewModel();

    return PartialView(viewModel);
}

[POST("Foo/Add")]
public virtual ActionResult AddFooPost(AddFooViewModel viewModel)
{
    // If ModelState is invalid, how do I redirect back to /Foo 
    // with the AddFooViewModel ModelState intact??
    if (!ModelState.IsValid)
        return MVC.FooBar.Foo();

    // ... persist changes and redirect
    return RedirectToAction(MVC.FooBar.Foo());
}

调用此部分视图如果有人提交带有 ModelState 错误的 AddFoo 表单,我希望 POST 操作重定向回 /Foo 并显示带有 ModelState 错误的 AddFoo 部分视图。处理这个问题的最佳方法是什么?

I have the following action

[GET("Foo")]
public virtual ActionResult Foo()
{
    return View(new FooViewModel());
}

the view for this action calls this partial view

@{ Html.RenderAction(MVC.FooBar.AddFoo()); }

with controller actions

[ChildActionOnly]
[GET("Foo/Add")]
public virtual ActionResult AddFoo()
{
    var viewModel = new AddFooViewModel();

    return PartialView(viewModel);
}

[POST("Foo/Add")]
public virtual ActionResult AddFooPost(AddFooViewModel viewModel)
{
    // If ModelState is invalid, how do I redirect back to /Foo 
    // with the AddFooViewModel ModelState intact??
    if (!ModelState.IsValid)
        return MVC.FooBar.Foo();

    // ... persist changes and redirect
    return RedirectToAction(MVC.FooBar.Foo());
}

If somebody submits the AddFoo form with ModelState errors, I want the POST action to redirect back to /Foo and show the AddFoo partial view with the ModelState errors. What's the best approach to handle this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

计㈡愣 2024-12-18 23:11:30

我认为您可以通过两种方式实现这一目标:

  1. 使用会话状态 使用
  2. 查询字符串参数传递数据

我更喜欢第二个选项。

I think you could achieve that in 2 ways:

  1. Using session state
  2. Passing your data using querystring params

I prefer the second option.

狂之美人 2024-12-18 23:11:30

我最终将视图模型放入 TempData 中,如下所示,并使用控制器上的 ModelStateToTempData 属性

[ChildActionOnly]
[GET("Foo/Add")]
public virtual ActionResult AddFoo()
{
    var viewModel = TempData["AddFooViewModel"] as AddFooViewModel ?? new AddFooViewModel();

    return PartialView(viewModel);
}

[POST("Foo/Add")]
public virtual ActionResult AddFooPost(AddFooViewModel viewModel)
{
    // If ModelState is invalid, how do I redirect back to /Foo 
    // with the AddFooViewModel ModelState intact??
    if (!ModelState.IsValid)
    {
        TempData["AddFooViewModel"] = viewModel;
        return RedirectToAction(MVC.FooBar.Foo());
    }

    // ... persist changes and redirect
    return RedirectToAction(MVC.FooBar.Foo());
}

I ended up putting the viewmodel into TempData like this with the ModelStateToTempData attribute on the controller

[ChildActionOnly]
[GET("Foo/Add")]
public virtual ActionResult AddFoo()
{
    var viewModel = TempData["AddFooViewModel"] as AddFooViewModel ?? new AddFooViewModel();

    return PartialView(viewModel);
}

[POST("Foo/Add")]
public virtual ActionResult AddFooPost(AddFooViewModel viewModel)
{
    // If ModelState is invalid, how do I redirect back to /Foo 
    // with the AddFooViewModel ModelState intact??
    if (!ModelState.IsValid)
    {
        TempData["AddFooViewModel"] = viewModel;
        return RedirectToAction(MVC.FooBar.Foo());
    }

    // ... persist changes and redirect
    return RedirectToAction(MVC.FooBar.Foo());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文