2012-11-28 36 views
1

此問題與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的局部視圖。

回答

0

爲什麼不爲你的搜索創建一個局部視圖,只需從你的用戶視圖中通過這個新的FindUserInputViewModel

@Html.Partial("FindUser", new FindUserInputViewModel()) 

您可以輸入您的局部視圖FindUserInputViewModel,並在那裏使用強類型的輔助方法。我會說這是最簡單最新穎的方法,除非我錯過了什麼?

相關問題