自定义编辑MVC2中模型的自定义属性

问题描述:

我正在处理一些通过属性相互关联的业务对象。例如,我从数据存储中加载一个“Entry”对象,并通过Author和Editor属性将它与“User”对象相关联。自定义编辑MVC2中模型的自定义属性

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) %> 

然后创建下共享/ EditorTemplates呈现它作为一个下拉列表(?可能)的视图控制,但是这似乎是它会破坏用户类的所有编辑。例如,如果我试图直接编辑用户对象,我希望能够更新与该类关联的字段。所以我需要编辑器模板是上下文敏感的。

我也试图下井手册的形式创建的路线:

<%= Html.DropDownFor(model => model.Author, (IEnumerable<SelectListItem>)ViewData["Users"]) %> 

但是这似乎乱,我很困惑,这些值是如何被序列化回从SelectListItem用户对象。

任何帮助表示赞赏。我确信之前已经讨论过这个问题,但是我很难从我的查询中获得任何信息。

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

这听起来像你需要开始使用ViewModels。 ViewModels是视图和模型之间的抽象,因此视图不会直接与模型进行交互,这可能会导致您发现的问题。

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

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

+0

这听起来够合理。但是,实际上我有一些问题。看起来,我有一种方式(进入视图),但在按下提交按钮后无法将其从视图中取出。 我收到以下错误:“从类型'System.String'到类型'TestComplexCreates.Models.User'的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。”这是可以理解的,因为下拉菜单显示字符串,而不是复杂的类型。任何想法,我缺少什么? – Krisc 2010-03-31 19:19:42

+0

我决定走这条路,只是因为似乎没有另一种方式。最终模型必须简化为简单类型。沮丧地说至少。 – Krisc 2010-04-22 12:19:45

+0

您可以通过查看T4模板来减少挫折感。 T4模板可以根据您的实体模型制作ViewModels。 – 2010-04-22 12:50:11