代码之家  ›  专栏  ›  技术社区  ›  Krisc

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

  •  1
  • Krisc  · 技术社区  · 16 年前

    我正在处理一些通过属性相互关联的业务对象。例如,我正在从数据存储中加载一个“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对象时,我想提供一个下拉列表,其中包含可用用户的列表。我不知道怎样才是最好的。

    现在我正在使用editorforcalls,但是它有它的问题。例如,我可以执行以下操作:

    <%= Html.EditorFor(model => model.Author) %>
    

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

    我还尝试了手动创建表单:

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

    但这看起来很混乱,我很困惑这些值是如何从SelectListItem序列化回用户对象的。

    感谢您的帮助。我确信这个问题以前已经讨论过了,但是我很难从我的查询中得到很多信息。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Dave Swersky    16 年前

    我建议使用强类型视图和EditFor。它更易于维护和测试。

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

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

    假设您希望用户能够更新 Entry.Author 属性-您可以填充 Authors 实体/表格。