2011-03-26 38 views
0

我有一個這樣的動作:動態模型和ModelState中

Update([Bind(Prefix = "CurrentModel")] dynamic edited)

但因此它似乎有動態對象沒有驗證,當我使用動態的ModelState.IsValid總是返回true?如果不是,我該如何解決這個問題?

回答

2

有兩種情況:

  1. 您使用的視圖模型作爲操作的參數在這種情況下,默認的模型綁定自動分配屬性和設置可能出現的錯誤的模型狀態:

    public ActionResult Update([Bind(Prefix = "CurrentModel")] EditViewModel edited) 
    { 
        if (ModelState.IsValid) 
        { 
    
        } 
        ... 
    } 
    
  2. 您正在對dynamicFormCollection使用一些弱類型,在這種情況下,默認模型綁定程序不會啓動並且根本不會執行任何驗證,因爲它無法推斷您的實際模型類型PE。在這種情況下,你需要手動調用TryUpdateModel並註明您的模型類型:

    public ActionResult Update(dynamic edited) 
    { 
        var model = new MyViewModel(); 
        if (!TryUpdateModel(model, "CurrentModel")) 
        { 
         // The model was not valid 
        } 
        ... 
    } 
    

結論:在一個控制器動作用dynamic的操作參數讓人很沒有意義。

+0

@ darin-dimitrov好的我明白了,我使用動態的原因是因爲Update方法是通用編輯界面的一部分,所以我不知道用戶正在編輯哪種類型。 該模型的類型爲Dashboard.Web.Mvc.ViewModels.IDashboardViewModel,其中包含IPageModel CurrentModel {get; }這是我正在編輯的對象。我同意,弱類型不是一件好事,但在這種情況下,其他模型是由另一個開發人員定義的,我認爲我需要這樣做,還是有另一種方法來編輯各種類型的模型? – Marcus 2011-03-26 14:45:11

+0

@Marcus,另一種可能性是爲'IDashboardViewModel'接口編寫一個自定義模型綁定器,然後基於某個請求參數(類型?)返回適當的實現。然後你的控制器動作可以將接口作爲參數。但是請求中必須有一些指示實際類型的內容。 – 2011-03-26 15:23:57

+0

@ darin-dimitrov,我最終將當前模型作爲參數添加到此更新(動態編輯器模型,動態模型)的動作中,然後按照您的建議使用TryUpdateModel(model,「CurrentModel」),並且它看起來很好。感謝您的幫助! – Marcus 2011-03-26 15:50:40