为什么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。第一次访问它时会被删除。

+0

我不知道这是一个OnActionExecuted过滤器。验证总结揭示了真相。我没有得到输入或字段验证错误类设置,因为我的错误是在“.Name”和“.Email”而不是“名称”和“电子邮件”这是什么输入字段的名称/ ids。奇怪。不知道为什么。正在插入。否则,事情似乎正在起作用。 – 2010-06-21 22:33:18

+0

刚刚碰到这个问题我自己,谢谢马尔科姆和克里斯F张贴的问题! – JoseMarmolejos 2010-10-20 19:33:50