2012-06-29 68 views
0

我使用PRG使用一個動作過濾器在MVC清理行動後在MVC

清理我的帖子在POST操作我存放在TempData的控制器的ModelState,然後重定向到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 }) 
} 

如果發生錯誤,我在後動作我添加錯誤到無效的ModelState中,然後重定向到付諸行動的ModelState中。

我的問題是我怎樣才能最好地確定,在GET「Details」操作中,模型在帖子後處於錯誤狀態?如果模型狀態無效,我想跳過邏輯...

var object = load(id); 

在GET操作中。我試過ModelState.IsValid,但這不起作用。

+0

你可以問的ModelState如果有效(將基於數據註解檢查本身):如果(ModelState.IsValid!){//做你的事}。你也可以爲「特殊」驗證添加你自己的模型狀態錯誤:ModelState.AddModelError(yourProperty,aMessage); ..雖然我不確定我是否確實理解你的問題。 –

+0

@ Team-JoKi他正在使用一個動作過濾器從POST請求導入TempData,以便遵循PRG模式。 POST到一個動作和ModelState是有效的,在TempData中推送模型狀態,然後重定向到GET動作,然後導入該模型狀態,以便表單具有適當的驗證器突出顯示等。 – Dismissile

+0

不應該只測試「if modelState .IsValid ...做重定向「別的只是將模型返回到你所在的視圖?你想在運行任何更新之前測試合法性 –

回答

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); 
     } 
    } 
} 
+0

想想如何存儲TempData [key]來檢查Modelstate.IsValid,但想知道是否有不同的方法。謝謝 –