0

我正在使用 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 }) 
}

如果发生错误,我在发布操作中添加一个错误到模型状态,使模型状态无效,然后重定向到获取操作。

我的问题是如何才能最好地确定模型在发布后处于错误状态的 GET“详细信息”操作?如果模型状态无效,我想跳过逻辑......

var object = load(id);

在 GET 操作中。我试过 ModelState.IsValid 但这不起作用。

4

1 回答 1

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);
        }
    }
}
于 2012-06-29T13:53:48.190 回答