0
我有一個這樣的動作:動態模型和ModelState中
Update([Bind(Prefix = "CurrentModel")] dynamic edited)
但因此它似乎有動態對象沒有驗證,當我使用動態的ModelState.IsValid
總是返回true?如果不是,我該如何解決這個問題?
我有一個這樣的動作:動態模型和ModelState中
Update([Bind(Prefix = "CurrentModel")] dynamic edited)
但因此它似乎有動態對象沒有驗證,當我使用動態的ModelState.IsValid
總是返回true?如果不是,我該如何解決這個問題?
有兩種情況:
您使用的視圖模型作爲操作的參數在這種情況下,默認的模型綁定自動分配屬性和設置可能出現的錯誤的模型狀態:
public ActionResult Update([Bind(Prefix = "CurrentModel")] EditViewModel edited)
{
if (ModelState.IsValid)
{
}
...
}
您正在對dynamic
或FormCollection
使用一些弱類型,在這種情況下,默認模型綁定程序不會啓動並且根本不會執行任何驗證,因爲它無法推斷您的實際模型類型PE。在這種情況下,你需要手動調用TryUpdateModel
並註明您的模型類型:
public ActionResult Update(dynamic edited)
{
var model = new MyViewModel();
if (!TryUpdateModel(model, "CurrentModel"))
{
// The model was not valid
}
...
}
結論:在一個控制器動作用dynamic
的操作參數讓人很沒有意義。
@ darin-dimitrov好的我明白了,我使用動態的原因是因爲Update方法是通用編輯界面的一部分,所以我不知道用戶正在編輯哪種類型。 該模型的類型爲Dashboard.Web.Mvc.ViewModels.IDashboardViewModel,其中包含IPageModel CurrentModel {get; }這是我正在編輯的對象。我同意,弱類型不是一件好事,但在這種情況下,其他模型是由另一個開發人員定義的,我認爲我需要這樣做,還是有另一種方法來編輯各種類型的模型? – Marcus 2011-03-26 14:45:11
@Marcus,另一種可能性是爲'IDashboardViewModel'接口編寫一個自定義模型綁定器,然後基於某個請求參數(類型?)返回適當的實現。然後你的控制器動作可以將接口作爲參數。但是請求中必須有一些指示實際類型的內容。 – 2011-03-26 15:23:57
@ darin-dimitrov,我最終將當前模型作爲參數添加到此更新(動態編輯器模型,動態模型)的動作中,然後按照您的建議使用TryUpdateModel(model,「CurrentModel」),並且它看起來很好。感謝您的幫助! – Marcus 2011-03-26 15:50:40