2016-02-02 79 views
0

我有一個單視圖模型用於多個窗體的設置和我的驗證導致我的問題。MVC,查看模型和[必需的]

問題1 我可以使用單一視圖模型,只驗證表單中使用的字段嗎?

我有一個視圖模型

public class KundeOrdreVM : IPanelVM 
    { 
     public string PhoneNumber { get; set; } 
     public string ItemEAN{ get; set; } 
    } 

在我看來,我有兩種形式(代碼簡化了這個例子)

<form action="/CreatePhone" method="post" novalidate="novalidate">      
    @Html.EditorFor(model => model.PhoneNumber) 
    <input type="submit" value="Create Phone"> 
</form> 

表2:

<form action="/CreateItem" method="post" novalidate="novalidate">      
    @Html.EditorFor(model => model.ItemEAN) 
    <input type="submit" value="Create Item"> 
</form> 

每種形式的用途來自共享ViewModel的單個字段。

我的問題是,我想使兩個字段[必需的],但只有當用戶張貼使用該字段的窗體。

有沒有什麼辦法讓這項工作,而重新使用相同的ViewModel?

問題2 如果非要使用多個的ViewModels,輸入每種形式,是有一個很好的設計實踐指南我怎麼可以在一個單一的視圖與多的ViewModels工作?

我不喜歡爲我的頁面上的每個表單製作大量的@ Html.RenderPartial。表格是緊密相連的。

回答

1

當你必須要求不同的表單時,它將分開ViewModels。通常ViewModel與視圖有1:1的關係,而1:n的關係並不常見。

其中一個原因是您未來可能會要求您改變其中一個視圖。如果你想將這個新字段添加到ViewModel,這也會影響你使用相同ViewModel的其他視圖。

最初,這可能看起來像更多的工作,但稍後更容易在需求更改時應用更改。

只有當它們完成相同的事情並且需要將其中一個更改反映到所有其他視圖時纔可以在多個視圖中重複使用ViewModels,例如LoginViewModel您有不同的登錄視圖,例如導航欄中的登錄字段,在用戶登錄時出現在任何地方,並且在嘗試訪問受保護頁面時顯示用戶重定向到的明確頁面。

+0

我很害怕這是案例。 那麼,我們如何處理一個我的頁面上有5個按鈕的情況,每個按鈕都是一個單獨的窗體,每個窗體都需要一個輸入欄。 我是否創建了5個ViewModel,然後創建了一個ParentViewModel來保存5個? – JesperGJensen

+0

不知道我明白ParentViewModel如何適應這一點。是PhoneNumber/ItemEAN還是爲什麼您需要逐一添加它們而不是(通過單獨的按鈕/表單)而不是單個表單。是否要捕獲用戶意圖(即使用事件採購)?從上面的代碼看來,每個按鈕都與一個動作綁定在一起,所以您只需要一個視圖模型來執行該動作。在這種情況下,ParentViewModel的目的是什麼? – Tseng

+0

情況是,我有一個訂單控制器和一個頁面,處理有關訂單的功能。在該頁面上,如果您有電話號碼,則可以創建新訂單,或者如果您擁有項目EAN,則可以將項目添加到列表中。兩個按鈕都是彼此相鄰的,您使用它們的順序是不相關的。我已經在我的控制器上使用了1個ViewModel,2個窗體,2個按鈕,2個動作。這導致了我這個問題,我不確定這種情況的最佳設計 – JesperGJensen