此問題與this one有關,但我認爲在我的示例中,我有可能會改變答案的詳細信息。應該視圖模型總是包含該視圖中表單的輸入?
說我有上呈現了關於特定用戶顯示數據的視圖控制器的用戶操作,它可能有一個UserViewModel
像這樣:
public class UserViewModel {
public string FirstName;
public string LastName;
etc...
}
然而,在這個視圖,以及顯示這個用戶數據,我想有一個用戶的搜索文本框,以便他們可以在這個頁面上查找另一個用戶。這種形式將張貼到FindUser的作用,它接受以下模型:
public class FindUserInputViewModel {
[Required]
public string SearchQuery;
}
如果這次行動發現該模型是無效的,它重定向回用戶操作,維護的ModelState。
現在,目前顯示的驗證錯誤,我不能爲搜索查詢財產UserViewModel
不使用強類型的幫手,我不得不這樣做:
@Html.TextBox("SearchQuery")
@Html.ValidationMessageFor("SearchQuery")
這工作,並顯示錯誤,以及顯示已發佈的舊值(因爲它保留在ModelState中)。不過,我寧願儘可能使用強類型的幫助器。
從我看到的所有例子中,這裏的模式似乎是UserViewModel
應該在其中包含FindUserInputViewModel,可能是FindUserInput
屬性。然後,我可以這樣做:
@Html.TextBoxFor(m => m.FindUserInput.SearchQuery)
這也適用,只要確保我FindUser行動結合正確的前綴,或者我指定的TextboxFor方法調用的名稱。
但是,我真的不明白爲什麼我的UserViewModel應該包含這個其他ViewModel只是爲了約束使用此助手的驗證的情況。它帶來了我沒有看到的其他好處嗎?如果您的View的模型需要展示您發佈的相同數據,例如在典型的「編輯」操作上,我理解它的用法,但這不是這種情況。
看起來,我認爲這將是得心應手這裏是另一種通用的幫手,可引用不同的類型,像這樣:
@Html.TextBoxForType<FindUserInput>(m => m.SearchQuery)
這不存在,但我想我應該是能夠寫出來,這是一個很好的例子。這聽起來像是一個合適的解決方案,還是我在這裏錯過了一些東西?
另一種選擇完全可能是發佈在FindUserInputViewModel
中的小表單應該有自己的GET操作以及POST,然後用戶視圖可以使用@Html.Action
來調用它。然後,它可以呈現僅強鍵入FindUserInputViewModel
的局部視圖。