2013-02-25 12 views
2

我試圖創建一個編輯器模板,它將爲傳入的選擇列表中的每個值創建一個「引導樣式」單選按鈕(就像Html.DropDownFor方法創建下拉列表)如何在編輯器模板中使用傳遞的選擇列表

所以我有我的觀點通話:

@Html.EditorFor(model => model.FaultTypeID,"RadioButtonList", 
     new SelectList(Model.AllowdeFaultTypes, "FaultTypeID", "FaultTypeName")) 

現在單選按鈕列表的模板:

@foreach (var item in ViewData["Items"] as SelectList) 
{ 
    <a>@item.Text</a> <b>@item.Value</b> 
} 

但轉換失敗,我GE t NullReferanceExeption。 通過反射我看到ViewData["Items"]值類型爲System.Collections.Generic.List<CamelotFaultManagement.DAL.FaultType>

問題是,我真的不希望緊密耦合RadioButtonList編輯模板,CamelotFaultManagement.DAL.FaultType類的,它只是沒有任何意義,做到這一點。我想要一個通用的編輯器模板。

回答

6

在您的編輯器模板中,您似乎正在使用一些您從未設置的ViewData["Items"]屬性。如果你想使用這些財產確認您已經分配的:

@Html.EditorFor(
    model => model.FaultTypeID, 
    "RadioButtonList", 
    new { Items = new SelectList(Model.AllowdeFaultTypes, "FaultTypeID", "FaultTypeName") } 
) 

這就是說,使用一些的ViewData的東西你的做法似乎完全錯誤的我。

我就簡單定義視圖模式(如在ASP.NET MVC總是):

public class RadioListViewModel 
{ 
    public string Value { get; set; } 
    public IEnumerable<SelectListItem> Values { get; set; } 
} 

,然後你可以有你的編輯模板強類型的這一觀點模型。當然,你的編輯模板現在將存儲在~/Views/Shared/EditorTemplates/RadioListViewModel.cshtml

@model IRadioListViewModel 
@foreach (var item in Model) 
{ 
    <a>@item.Text</a> <b>@item.Value</b> 
} 

現在所有剩下的就是在主視圖模型使用這個視圖模型:

public class MyViewModel 
{ 
    public RadioListViewModel FaultTypes { get; set; } 
    ... 
} 

,然後裏面你的觀點簡單地渲染相應的編輯模板:

@model MyViewModel 
... 
@Html.EditorFor(x => x.FaultTypes) 

簡單,常規,強類型。

+1

我的天啊!我以爲我通過它..必須創建一個匿名對象,並忘記了!謝謝! – Mortalus 2013-02-25 13:16:12

+0

在進入ViewData混亂之前,請閱讀我推薦的方法。 – 2013-02-25 13:17:33

+0

我有一個問題與您的建議,因爲我試圖創建一個TypeID的編輯器是一個整數類型,我想有一個封閉的類型,用戶可以選擇,所以我不明白我是如何可以使用「RadioListViewModel」的編輯器輸入「TypeID」屬性的值。 – Mortalus 2013-02-25 13:25:35

相關問題