自定义编辑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
。
这听起来够合理。但是,实际上我有一些问题。看起来,我有一种方式(进入视图),但在按下提交按钮后无法将其从视图中取出。 我收到以下错误:“从类型'System.String'到类型'TestComplexCreates.Models.User'的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。”这是可以理解的,因为下拉菜单显示字符串,而不是复杂的类型。任何想法,我缺少什么? – Krisc 2010-03-31 19:19:42
我决定走这条路,只是因为似乎没有另一种方式。最终模型必须简化为简单类型。沮丧地说至少。 – Krisc 2010-04-22 12:19:45
您可以通过查看T4模板来减少挫折感。 T4模板可以根据您的实体模型制作ViewModels。 – 2010-04-22 12:50:11