2012-05-06 54 views
0

所以我想在MVC中獲取一個常見的事件類型下拉列表。UIHint MVC Common Dropdownlist

我下創建的局部視圖共享/ 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 

回答

2

所有你需要做的是讓你的編輯模板部分,這個編輯器是屬性的類型的模型類型將被編輯,而不是包含模型的類型。

假設你有一個EventType類,一CreateEventModelEditEventModel,並且兩個CreateEventModelEditEventModelEventType特性,如:

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; 

並不真正屬於某個視圖,但那是另一個問題。)

+0

這對於使用帶有EventType數據類型的@ model非常有用。我結束了使用@model int?所以它可以被任何視圖一般使用。 –