1

我只是试图将 ModelState 从一个动作传递到同一个控制器中的另一个动作,以进行验证。但是,模型状态不会更新。我看到 TempData["____MvcContrib_ValidationFailures____"] 包含来自转发操作的 ModelStateDictionary,但我认为这应该自动转移到我当前的 ModelState 中?我哪里错了?

我正在使用 ASP.NET MVC2 和 MVCContrib 2.0.36.0。我也试过用这个属性装饰Controller,但结果是一样的。

代码:

[HttpGet]
[ModelStateToTempData]
public ActionResult NewsEventsSignup()
{
    var newsEventsSignupDetails = this.TempData.GetItem<NewsEventsSignupDetails>();

    var viewModel = _newsEventsSignupPageViewModelMapper.MapFrom(newsEventsSignupDetails);

    return this.View(viewModel);
}

[HttpPost]
[ModelStateToTempData]
[ValidateAntiForgeryToken]
public ActionResult NewsEventsSignup(NewsEventsSignupFormViewModel newsEventsSignup)
{
    ActionResult resultToReturn;

    var newsEventsSignupDetails = _newsEventsSignupDetailsMapper.MapFrom(newsEventsSignup);

    try
    {
        _newsEventsSignupTasks.SignupForNewsAndEvents(newsEventsSignupDetails);
        resultToReturn = this.RedirectToAction(x => x.Index());
    }
    catch (RulesException e)
    {
        e.AddModelStateErrors(this.ModelState); // from xVal
        this.TempData.AddItem(newsEventsSignupDetails); // for showing invalid input
        resultToReturn = this.RedirectToAction(x => x.NewsEventsSignup());
    }

    return resultToReturn;
}
4

1 回答 1

1

您如何检查 ModelState 是否未填充?这是一个 OnActionExecuted 过滤器,因此仅在 Action 完成时才填充。您无法检查操作中的值。

验证 ModelState 是否确实存在错误的最简单方法是将验证摘要放在视图上。

要查看您的错误与 xval 无关,我会尝试

ModelState.AddModelError("TestError", "This is an errortest");

在重定向之前的 NewsEventsSignup 中。

也不要尝试在调试器或某些调试代码中访问 TempData。首次访问时将其删除。

于 2010-06-21T20:09:05.623 回答