2012-09-26 28 views
1

控制器方法調用期間會發生什麼? MVC是否爲您的控制器中的每個PUBLIC方法評估/設置ModelState?它在方法參數中測試EVERY類嗎?MVC控制器操作和ModelState.IsValid發生了什麼

public ActionResult Create(Entity myEntity, AnotherEntity, myEntity2) 
{ 
    if (ModelState.IsValid) 
    { 

如果我有整型對的ActionResult返回:

public int Create(Entity myEntity, AnotherEntity, myEntity2) 
{ 
    if (ModelState.IsValid) 
    { 

會還有與所評價的一類??的ModelState

回答

2

其實它不是控制器。這是模型活頁夾。模型聯編程序的責任是在給定請求值的情況下實例化相應的模型。所以第一步是模型綁定,第二步是驗證。第一步由模型聯編程序完成。如果在此步驟中出現錯誤(例如,您試圖將模型上的整數字段綁定到用戶輸入一些任意文本的輸入文本),則模型綁定器會自動向模型狀態添加錯誤,因此一旦您輸入控制器動作,你可以測試是否ModelState.IsValid

如果模型綁定成功,那麼您有一個現在傳遞給相應驗證框架的模型實例。因此,例如,如果您使用數據註釋並使用驗證屬性修飾模型屬性,則會評估它們,如果有錯誤,則會再次自動將它們添加到模型狀態。

如果我有整型對的ActionResult返回:

你會違反ASP.NET MVC標準約定,所有的控制器動作必須返回的ActionResult。但是返回類型實際上與輸入參數和驗證的模型綁定無關。返回類型可以是ActionResult的任何可能派生類或自定義派生類。

因此,例如,如果要渲染模型的HTML表示形式,則返回ViewResult。如果您想返回模型的JSON表示,則返回JsonResult。如果你想返回一些靜態字符串,你會返回一個ContentResult。如果您想允許用戶下載文件,則返回FileResult。等等。

+0

我明白這是模型活頁夾。我沒有得到的是模型聯編程序何時被調用,以及它被調用的是什麼。 在調用方法時,模型聯編程序是否會自動獲取控制器中每個公共方法的調用?或者它只對ActionResults執行此操作? 模型聯編程序然後查看方法參數中的每個類並將所有錯誤彙總到ModelState中 – user965445

+0

在調用動作之前調用模型聯編程序。模型聯編程序的職責是從請求中檢索所有值並實例化模型並通過解析值來設置其屬性。完成所有這些工作後,將調用控制器操作並傳遞由模型聯編程序創建的模型。 –

相關問題