0

所以我试图在 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 dynamic,但它在 Visual Studio 中返回了这个错误:

An expression tree may not contain a dynamic operation
4

1 回答 1

2

您需要做的就是使编辑器模板的模型类型部分成为该编辑器将要编辑的属性的类型,而不是包含模型的类型。

假设您有一个EventType类 aCreateEventModel和 an EditEventModel,并且 theCreateEventModel和 theEditEventModel都有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)

请注意 DropDownListFor() 调用中的简单 m => 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;

并不真正属于视图,但这是另一个问题。)

于 2012-05-06T16:51:07.883 回答