【问题标题】:Reusable editor template with DropDownList for business objects用于业务对象的可重用编辑器模板,带有 DropDownList
【发布时间】:2011-07-19 08:41:21
【问题描述】:

我正在使用带有 Razor 视图的 MVC3,并希望为我的几个类构建可重用的 DropDownLists,但经过大量搜索后,我没有找到一个完全符合我需要的示例......

对于这个例子,我有两个这样的类:-

public class Person
{
  public int ID { get; set; }
  public string Name { get; set; }
  public Group Group { get; set; }
}

public class Group
{
  public int ID { get; set; }
  public string Name { get; set; }
}

我有一个用于 Person 的工作控制器/视图。该视图有一个 DropDownListFor 控件:

@model Person

...

@Html.DropDownListFor(o => o.Group.ID, (ViewData["groups"] as SelectList))

视图直接使用 Person 类,而不是中间模型,因为在这个阶段我还没有找到一个令人信服的理由将一个与另一个抽象出来。

以上工作正常...在控制器中,我从视图返回的 Person 中的 Group.ID 中获取值,查找它,并将 Person.Group 设置为结果。有效,但并不理想。

我在这里找到了一个活页夹:MVC DropDownList values posted to model aren't bound,它可以帮我解决这个问题,但我还没有完成这个工作......因为它只有在我可以重复使用时才真正有用。

我想做的是在模板中有这样的东西:-

@model Group

@Html.DropDownListFor(o => o.Group.ID, (ViewData["groups"] as SelectList))

并在这样的视图中使用它:-

@Html.EditorFor(o => o.Group)

但是上面似乎不起作用...上面的 EditorFor 行插入了整个类的编辑器(例如 Group.Description 的文本框)...而不是插入包含我的组的 DropDownList

我在 Views/Shared/EditorTemplates 下名为 Group.cshtml 的文件中有上述模板

如果这可行,那么只要一个类具有 Group 类型的属性,就会默认使用此 DropDownList 编辑器(或至少在某些属性指定的情况下)

提前感谢您提供的任何建议...

【问题讨论】:

    标签: asp.net-mvc-3 templates drop-down-menu razor editor


    【解决方案1】:

    您可以创建一个下拉列表用户控件来处理此问题。在您的 Shared 文件夹下创建一个名为 EditorTemplates 的文件夹并将您的用户控件放在那里。按照惯例,MVC 在 Shared/EditorTemplates 中查找任何编辑器模板。您可以覆盖它查找编辑器模板的位置,但我不会在这里讨论。

    创建用户控件后,您需要使用“UIHint”属性装饰适当的属性,以告诉引擎应该为该属性使用哪个编辑器。

    以下是一个示例实现。

    在 Shared/EditorTemplates 文件夹中,您的用户控件(在本例中为 _GroupsDropDown.cshtml)如下所示:

    @model Group
    
    @Html.DropDownListFor(o => o.ID, (ViewData["groups"] as SelectList))
    

    修改Person中的Group属性,添加UIHint属性如下:

    **[UIHint("_GroupsDropDown")]**
    public Group Group { get; set; }
    

    在你的控制器中你需要

    ViewData["groups"] = new SelectList(<YourGroupList>, "ID", "Name");
    

    一旦你有了上面的代码,你就可以随意使用 EditorFor 语法了。

    希望这会有所帮助。

    【讨论】:

    • 这是一个很好的答案。我想补充一点,您可以告诉EditorFor 在哪里查找模板(例如,如果您想在逐个视图基础上使用不同的模板)。它看起来像这样:@Html.EditorFor(x =&gt; x.Filters.SelectedImprintId, "~/Views/Books/EditorTemplates", Model.Filters.ImprintItems)
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多