我正在使用PRG来清理MVC中的帖子
在POST操作中,我使用动作过滤器将控制器模型状态存储在tempdata中,然后重定向到重新加载模型状态的GET方法。
GET和POST操作标题:
[ImportModelStateFromTempData]
public ActionResult Details(int id) {
var object = load(id);
return View(object);
}
[HttpPost]
[ExportModelStateToTempData]
public ActionResult Details(MyViewModel model) {
update(model); return RedirectToAction("Details", new { id = model.id })
}
如果发生错误,我在post操作中向模型状态添加一个错误,该错误使模型状态失效,然后重定向到get动作。
我的问题是,在GET“详细信息”操作中,如何最好地确定模型在发布后处于错误状态?如果模型状态无效,我想跳过逻辑......
var object = load(id);
在GET行动中。我已经尝试了ModelState.IsValid,但这不起作用。
答案 0 :(得分:1)
您可以尝试这样的事情:
public void OnActionExecuting(ActionExecutingContext filterContext)
{
ModelStateDictionary modelState = filterContext.Controller.TempData[Key] as ModelStateDictionary;
if( !modelState.IsValid )
{
filterContext.Controller.TempData.Add("IsValid", false);
}
}
在您的控制器中,您可以检查TempData [“IsValid”]字段而不是ModelState.IsValid:
if( TempData["IsValid"] != null ) // do whatever here, or skip code etc.
注意动作过滤器代码在OnActionExecuting方法中的作用。你会将现有代码保留在OnActionExecuted:
中public void OnActionExecuting(ActionExecutingContext filterContext)
{ ModelStateDictionary modelState = filterContext.Controller.TempData[Key] as ModelStateDictionary;
if (modelState != null)
{
if (filterContext.Result is ViewResult)
{
filterContext.Controller.ViewData.ModelState.Merge(modelState);
}
else
{
filterContext.Controller.TempData.Remove(Key);
}
}
}