【问题标题】:UIHint MVC Common DropdownlistUIHint MVC 常用下拉列表
【发布时间】:2012-05-06 15:31:36
【问题描述】:

所以我试图在 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

【问题讨论】:

    标签: c# model-view-controller


    【解决方案1】:

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

    假设您有一个EventType 类、一个CreateEventModel 和一个EditEventModel,并且CreateEventModelEditEventModel 都有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 类型的属性。

    您可以在 CreateEventModelEditEventModel 的视图中使用此模板,如下所示:

    创建视图:

    @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;
    

    确实不属于视图,但这是另一个问题。)

    【讨论】:

    • 这对于使用带有 EventType 数据类型的 @model 非常有帮助。我最终使用了@model int?所以它可以被任何视图普遍使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多