所以我试图在MVC中获得一个常见的事件类型下拉列表。
我在Shared / EditorTemplates /
下创建了一个局部视图以下是其内容:
@model EventManager.Models.CreateEventModel
@{
EventManager.Models.DropdownEventTypesModel dropdownList = new EventManager.Models.DropdownEventTypesModel();
List<SelectListItem> types = dropdownList.EventTypes;
Html.DropDownListFor(model => model.Type, types);
}
这很好用,除了我需要为每个想要使用这个常见下拉列表的模型创建一个新的局部视图,从而打败目的。在C#MVC中是否有一种方法可以说模型将具有此Type属性,但是没有指定它将来自哪个特定模型?
我试过@model动态,但它在Visual Studio中返回了这个错误:
An expression tree may not contain a dynamic operation
答案 0 :(得分:2)
您需要做的就是使编辑器模板的模型类型部分为此编辑器将要编辑的属性的类型,而不是包含模型的类型。
假设您有一个EventType
类,一个CreateEventModel
和一个EditEventModel
,并且CreateEventModel
和EditEventModel
都有EventType
个属性,像这样:
public class CreateEventModel
{
//Other stuff here....
public EventType TypeToCreate { get; set; }
}
public class EditEventModel
{
//Other stuff here....
public EventType TypeToEdit { get; set; }
}
您在EditorTemplates文件夹中创建一个名为EventType.cshtml的部分,并在其中放置如下内容:
@model EventManager.Models.EventType
@{
var types = //put whatever you need here to get the list of available types*;
}
@Html.DropDownListFor(m => m, types)
注意简单的m =&gt; DropDownListFor()调用中的m表达式,以及此处没有对任何包含模型的引用这一事实:@model声明中的类型只是EventType。所有编辑器模板需要知道的是它将用于编辑EventType类型的属性。
您可以在CreateEventModel
和EditEventModel
的观看次数中使用此模板,如下所示:
创建视图:
@model EventManager.Models.CreateEventModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@*Other stuff here...*@
@Html.EditorFor(m => m.TypeToCreate)
修改视图:
@model EventManager.Models.EditEventModel
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@*Other stuff here...*@
@Html.EditorFor(m => m.TypeToEdit)
(*您使用的代码:
EventManager.Models.DropdownEventTypesModel dropdownList = new EventManager.Models.DropdownEventTypesModel();
List<SelectListItem> types = dropdownList.EventTypes;
并不属于视图,但这是另一个问题。)