自定义编辑器,用于MVC2中Model的自定义类型属性

时间:2010-03-31 18:15:30

标签: c# asp.net-mvc-2

我正在处理一些通过其属性相互关联的业务对象。例如,我从数据存储中加载一个“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对象感到困惑。

感谢任何帮助。我确信之前已经解决了这个问题,但是我无法从查询中获取任何信息。

1 个答案:

答案 0 :(得分:2)

我推荐使用强类型视图和EditFor。维护和测试要容易得多。

听起来你需要开始使用ViewModels。 ViewModel是View和Model之间的抽象,因此View不会直接与Model交互,这可能会导致您发现的问题。

ViewModel有时只是实际Model的“包装器”。以Entry类为例,ViewModel可能为EntryViewModel。它可以具有Entry属性,以及支持您想要显示的相关数据。重要的是,ViewModel仅包含数据需要它支持的View,仅此而已。

假设您希望用户能够从条目视图更新Entry.Author属性 - 您可以使用EntryViewModel实体/表中的ID和名称列表填充Authors