我有两个课程项目和类别。项目可能属于单个类别。在实现中我使用的是NHibernate,而Item有一个Category属性(类型为Category)。这两个类都是实体。
我想知道如何在视图中编辑项目以便能够从列表或下拉列表中选择类别。有像Html.DropDownListFor这样的HTML帮助器,但是当我需要选择一个对象时,我不知道如何使它工作(NHibernate不会使ItemId为Item可访问)。有人可以帮我解决这个问题吗?
提前致谢
卢卡斯
答案 0 :(得分: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”是属性的名称(来自成员实体),用作选项的值。第二个参数是选项的文本。在我的例子中,它是Member的Name属性。
我以这种方式在控制器中填充成员ID:
ViewBag.membersDD = memberProvider.GetMembers();
我正在使用Entity Framework,不知道它是否与NHibernate相同。
顺便说一句:这个片段来自我对任务实体的编辑操作(分配给某个成员,您可以从下拉列表中选择)。
答案 1 :(得分: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")
)
如果您不使用视图模型,您将很难将现有模型调整到它们本身不适合的情况。