具有部分视图的无效ModelState

时间:2011-10-26 18:01:49

标签: asp.net-mvc-3 validation partial-views t4mvc

我有以下行动

[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局部视图。处理这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

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

  1. 使用会话状态
  2. 使用querystring params传递数据
  3. 我更喜欢第二种选择。

答案 1 :(得分:0)

我最终使用控制器上的TempData属性将viewmodel放入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());
}