2011-04-17 92 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