为什么MVCContrib的ModelStateToTempData属性不起作用?
问题描述:
我只是试图将ModelState从一个动作传递给另一个控制器,以进行验证。但是,模型状态不会更新。我发现TempData [“____ MvcContrib_ValidationFailures____”]包含来自转发Action的ModelStateDictionary,但我认为这应该自动转移到我当前的ModelState中?我哪里错了?为什么MVCContrib的ModelStateToTempData属性不起作用?
我正在使用ASP.NET MVC2和MVCContrib 2.0.36.0。我也尝试用这个属性装饰控制器,但结果是一样的。
代码:
[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;
}
答
你如何检查ModelState中未填充?这是一个OnActionExecuted过滤器,因此只有在Action完成时才会被填充。您无法检查操作中的值。
验证ModelState真的有错误的最简单方法是在视图上添加验证摘要。
要查看你的错误是不是XVAL与我会尝试
ModelState.AddModelError("TestError", "This is an errortest");
在NewsEventsSignup重定向之前。
也不要尝试在调试器或某些调试代码中访问TempData。第一次访问它时会被删除。
我不知道这是一个OnActionExecuted过滤器。验证总结揭示了真相。我没有得到输入或字段验证错误类设置,因为我的错误是在“.Name”和“.Email”而不是“名称”和“电子邮件”这是什么输入字段的名称/ ids。奇怪。不知道为什么。正在插入。否则,事情似乎正在起作用。 – 2010-06-21 22:33:18
刚刚碰到这个问题我自己,谢谢马尔科姆和克里斯F张贴的问题! – JoseMarmolejos 2010-10-20 19:33:50