2011-07-19 29 views
5

我使用MVC3 Razor視圖,並希望爲我的幾個類構建可重複使用的DropDownLists,但經過多次搜索,我還沒有找到一個示例,執行完全如何我需要它。 ..業務對象的DropDownList可重複使用的編輯器模板

在這個例子中,我有兩個班是這樣的: -

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

我有一個人工作的控制器/視圖。視圖有一個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) 

但是上面沒有按」 t似乎工作...上面的EditorFor行爲整個類插入編輯器(例如一個Group.Description的文本框)...而不是插入一個DropDownList與我列出的組

我有上面的t在一個名爲Group.cshtml的視圖/共享/編輯器模板下的文件模板

如果這個工作,那麼無論何時一個類有一個Group類型的屬性,這個DropDownList編輯器將默認使用(或者至少如果由某個屬性)

預先感謝提供的任何意見...

回答

6

您可以創建一個下拉列表中的用戶控件來處理這個問題。在您的共享文件夾下創建一個名爲EditorTemplates的文件夾,並將您的用戶控件放置在那裏。按照慣例,MVC在Shared/EditorTemplates中查找任何編輯器模板。您可以重寫它在編輯器模板中的位置,但我不會在這裏介紹。

一旦你創建了用戶控件,你需要用「UIHint」屬性來修飾相應的屬性,以告訴引擎它應該使用哪個編輯器。

以下是一個示例實現。

在Shared/EditorTemplates文件夾中,您的用戶控件(_GroupsDropDown。CSHTML在這種情況下)看起來像:

@model Group 

@Html.DropDownListFor(o => o.ID, (ViewData["groups"] as SelectList)) 

修改組屬性在Person添加UIHint屬性如下:

**[UIHint("_GroupsDropDown")]** 
public Group Group { get; set; } 

在你的控制器,你就需要

ViewData["groups"] = new SelectList(<YourGroupList>, "ID", "Name"); 

一旦你有了上面的代碼,你可以使用EditorFor語法來滿足你的需求。

希望這會有所幫助。

+2

這是一個很好的答案。我想補充一點,你可以告訴'EditorFor'在哪裏尋找模板(比如,如果你想在視圖上使用不同的模板)。它看起來像這樣:'@ Html.EditorFor(x => x.Filters.SelectedImprintId,「〜/ Views/Books/EditorTemplates」,Model.Filters.ImprintItems)' –

相關問題