我正在处理一些通过其属性相互关联的业务对象。例如,我从数据存储中加载一个“Entry”对象,并通过Author和Editor属性将其与“User”对象相关联。
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) %>
然后在Shared / EditorTemplates下创建一个视图控件,将其显示为下拉列表(可能?),但这似乎会破坏User类的所有编辑。例如,如果我尝试直接编辑User对象,我希望能够更新与该类关联的字段。所以我需要编辑器模板对上下文敏感。
我还试图沿着手动表单创建的路线前进:
<%= Html.DropDownFor(model => model.Author, (IEnumerable<SelectListItem>)ViewData["Users"]) %>
但这看起来很混乱,我对如何将值从SelectListItem序列化回User对象感到困惑。
感谢任何帮助。我确信之前已经解决了这个问题,但是我无法从查询中获取任何信息。
答案 0 :(得分:2)
我推荐使用强类型视图和EditFor。维护和测试要容易得多。
听起来你需要开始使用ViewModels。 ViewModel是View和Model之间的抽象,因此View不会直接与Model交互,这可能会导致您发现的问题。
ViewModel有时只是实际Model的“包装器”。以Entry类为例,ViewModel可能为EntryViewModel
。它可以具有Entry
属性,以及支持您想要显示的相关数据。重要的是,ViewModel仅包含仅数据需要它支持的View,仅此而已。
假设您希望用户能够从条目视图更新Entry.Author
属性 - 您可以使用EntryViewModel
实体/表中的ID和名称列表填充Authors