Шаблон PRG в порядке, но я сделал это:
Базовый контроллер:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (TempData["ModelState"] != null && !ModelState.Equals(TempData["ModelState"]))
ModelState.Merge((ModelStateDictionary)TempData["ModelState"]);
base.OnActionExecuted(filterContext);
}
Действие (я использую xVal ):
try
{
user.Login();
AuthenticationManager.SignIn(user);
}
catch (RulesException rex)
{
// on bad login
rex.AddModelStateErrors(ModelState, "user");
TempData["ModelState"] = ModelState;
return Redirect(Request.UrlReferrer.ToString());
}
Действие выдает исключение, добавляет ModelState к TempData и перенаправляет обратно к рефереру. Поскольку действие перехватывается, OnActionExecuted все еще выполняется, но первый раз вокруг ModelState - это то же самое, что TempData ["ModelState"], поэтому вы не хотите сливаться с самим собой. Когда действие перенаправления выполняется, OnActionExecuted запускается снова. На этот раз, если что-то есть в TempData ["ModelState"], оно сливается с ModelState этого действия.
Вы можете расширить его до нескольких моделей, используя TempData ["ModelState.user"] = ModelState и затем объединяя каждый объект TempData, который начинается с ModelState.