清理MVC中的后期操作

时间:2012-06-29 13:34:26

标签: c# asp.net-mvc post-redirect-get

我正在使用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,但这不起作用。

1 个答案:

答案 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);
        }
    }
}