具有DropDownList的可重用编辑器模板,用于业务对象

时间:2011-07-19 08:41:22

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

我正在使用带有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; }
}

我有一个工作的Controller / View for 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编辑器(或至少在某些属性指定的情况下)

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

1 个答案:

答案 0 :(得分:6)

您可以创建下拉列表用户控件来处理此问题。在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语法。

希望这有帮助。