我正在使用带有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编辑器(或至少在某些属性指定的情况下)
提前感谢您提供的任何建议......
答案 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语法。
希望这有帮助。