2010-03-31 117 views
1

我正在處理一些通過屬性相互關聯的業務對象。例如,我從數據存儲中加載一個「Entry」對象,並通過Author和Editor屬性將它與「User」對象相關聯。自定義編輯MVC2中模型的自定義屬性

class Entry{ 
    public User Author { get; set; } 
    public User Editor { get; set; } 
} 

class User{ 
    public string Username { get; set; } 
} 

當我使用MVC2創建一個新的Entry對象,我想提供一個下拉具有可用用戶的列表。我失去了最好的方式。

現在我正在使用EditorFor調用的路徑,但它有它的問題。例如,我可以做到以下幾點:

<%= Html.EditorFor(model => model.Author) %> 

然後創建下共享/ EditorTemplates呈現它作爲一個下拉列表(?可能)的視圖控制,但是這似乎是它會破壞用戶類的所有編輯。例如,如果我試圖直接編輯用戶對象,我希望能夠更新與該類關聯的字段。所以我需要編輯器模板是上下文敏感的。

我也試圖下井手冊的形式創建的路線:

<%= Html.DropDownFor(model => model.Author, (IEnumerable<SelectListItem>)ViewData["Users"]) %> 

但是這似乎亂,我很困惑,這些值是如何被序列化回從SelectListItem用戶對象。

任何幫助表示讚賞。我確信之前已經討論過這個問題,但是我很難從我的查詢中獲得任何信息。

回答

2

我推薦使用強類型Views和EditFor。維護和測試要容易得多。

這聽起來像你需要開始使用ViewModels。 ViewModels是視圖和模型之間的抽象,因此視圖不會直接與模型進行交互,這可能會導致您發現的問題。

ViewModel有時只是實際模型的「包裝」。以你的Entry類爲例,一個ViewModel可能是EntryViewModel。它可能有一個Entry屬性,以及支持要顯示的相關數據。重要的是ViewModel只包含數據需要的View支持,僅此而已。

假設您希望用戶能夠從條目視圖更新Entry.Author屬性 - 您可以使用Authors實體/表中的ID和名稱列表填充EntryViewModel

+0

這聽起來夠合理。但是,實際上我有一些問題。看起來,我有一種方式(進入視圖),但在按下提交按鈕後無法將其從視圖中取出。 我收到以下錯誤:「從類型'System.String'到類型'TestComplexCreates.Models.User'的參數轉換失敗,因爲沒有類型轉換器可以在這些類型之間進行轉換。」這是可以理解的,因爲下拉菜單顯示字符串,而不是複雜的類型。任何想法,我缺少什麼? – Krisc 2010-03-31 19:19:42

+0

我決定走這條路,只是因爲似乎沒有另一種方式。最終模型必須簡化爲簡單類型。沮喪地說至少。 – Krisc 2010-04-22 12:19:45

+0

您可以通過查看T4模板來減少挫折感。 T4模板可以根據您的實體模型製作ViewModels。 – 2010-04-22 12:50:11