2011-04-17 121 views
0

我有兩個類Item和Category。項目可能屬於一個類別。在實現中,我使用NHibernate和Item有一個Category屬性(類型爲Category)。這兩個類都是實體。ASP.NET MVC從列表中選擇對象

我想知道如何在視圖中編輯項目以便能夠從列表或下拉列表中選擇一個類別。有HTML助手像Html.DropDownListFor但我不知道如何使它在我需要選擇一個對象時工作(NHibernate不會使ItemId的CategoryId可訪問)。有人能幫我解決這個問題嗎?

在此先感謝
盧卡斯

回答

0

您應該在所有情況下都使用視圖模型。所以不管你的NHibernate模型如何看起來像你試圖在視圖中顯示一個下拉列表。因此,作爲始終通過定義,將舉行必要的信息,以通過此視圖中使用的視圖模型開始:

public class CategoryViewModel 
{ 
    public int SelectedItemId { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

,然後你將有一個控制器動作將從一個存儲庫中取出模型,並將其映射到該視圖模型:

public ActionResult Index() 
{ 
    Category category = ... 
    // Example using AutoMapper 
    CategoryViewModel viewModel = Mapper.Map<Category, CategoryViewModel>(category); 
    return View(viewModel); 
} 

,並在視圖簡單:

@Html.DropDownListFor(
    x => x.SelectedItemId, 
    new SelectList(Model.Items, "Value", "Text") 
) 

如果你不使用你會掙扎到您現有的模型適應形勢視圖模型爲此他們不是這個意思。

+0

如何合理地處理這樣一個事實,即沒有一個項目可以被選中。 – GUZ 2011-04-17 17:34:22

0

我使用這個:

<div class="editor-label"> 
    @Html.LabelFor(model => model.MemberId) 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.MemberId, new SelectList(ViewBag.membersDD as System.Collections.IEnumerable, "Id", "Name")) 
    @Html.ValidationMessageFor(model => model.MemberId) 
</div> 

其中,「ID」是的財產(會員單位),這是用來作爲選項值名稱。第二個參數用於選項的文本。在我的情況下,它的成員的名稱屬性。

我填寫membersDD控制器中這樣說:

ViewBag.membersDD = memberProvider.GetMembers(); 

我使用實體框架,不知道它同樣與NHibernate。

順便說一句:這段代碼來自我對任務實體的編輯操作(分配給某個成員,您可以從下拉列表中選擇)。

+0

不幸的是,NHibernate不會讓外鍵可訪問(就像EF中你的例子中的MemberId) – GUZ 2011-04-17 06:19:12

+0

呃......那麼你如何獲得相關的實體呢? – Damb 2011-04-17 06:20:40

+0

正如我寫的那樣,有Category類別的Category屬性。所以要設置它,你需要做一些事情:'item.Category = category;' – GUZ 2011-04-17 06:29:15