2011-12-02 52 views
5

我有以下型號:RadioButtonFor在編輯模版選擇值

public class Person 
{ 
    public string Name { get; set; } 
    public string Gender { get; set; } 
} 

我想默認的性別是女性,所以我設置了在行動:

public ActionResult Create() 
{ 
    var model = new Person { Gender = "F" }; // default is female 
    return View(model); 
} 

最後,視圖呈現的一切是這樣的:

@model Person 

@using (Html.BeginForm()) 
{ 
    @Html.EditorForModel() 
    <p><input type="submit" value="Create" /></p> 
} 

這一切都按預期工作。現在,讓我們說,而不是一個簡單的文本框,我想顯示性別作爲一個更直觀的一對單選按鈕。所以,我提出以下模板,並將其保存到共享/ EditorTemplates/Gender.cshtml:

@model string 
@Html.RadioButtonFor(model => model, "F") Female 
@Html.RadioButtonFor(model => model, "M") Male 

最後我裝點性別與[UIHint("Gender")]

性別現在正確地單選按鈕,這是偉大的呈現,但...

問題

女不再是預先選定爲默認值,而是我結束了與兩個單選按鈕空白。我錯過了什麼嗎?

有趣的是,如果我將RadioButtonFor從模板移動到視圖(更改model => modelmodel => model.Gender),則一切都按預期工作。我知道這是一個可行的解決方法,但這些模板化的助手是如此令人驚歎,令人上癮的便利,我寧願在讓他們走之前用盡所有可能。

回答

9

我知道這是醜陋的,但以下可能的工作:

@model string 
@Html.RadioButton("", "F", Model == "F") Female 
@Html.RadioButton("", "M", Model == "M") Male 

與單選助手的問題是,如果第一個參數爲空或空,它會永遠把它作爲非託運從而使這一幫手不合適爲編輯器模板。

下面是從MVC源代碼的摘錄這說明我的意思:

bool isChecked = !string.IsNullOrEmpty(name) && string.Equals(htmlHelper.EvalString(name), b, StringComparison.OrdinalIgnoreCase); 

作爲替代,你可以使用一個custom HTML helper產生單選按鈕的列表。

+0

+1和答案。工作過一種享受!這也不是那麼醜陋。如果有的話,我寧願忍受我的'@ Html.EditorForModels()'謝謝!:) –

+0

我同意這不是醜陋的,而且工作的魅力。 – danludwig

+0

我採納了這個想法並對其進行了擴展。我將一個List >傳遞給我的編輯器模板,作爲添加的ViewData,用於創建單選按鈕。我的模板看起來像這樣 – davidbitton

0

我把這個想法並加以擴展。我將List<Dictionary<string,string>>傳遞給我的編輯器模板,添加了ViewData用於創建單選按鈕。我的模板看起來像這樣

@model string 
@{ 
    var buttons = (List<Dictionary<string, string>>)ViewData["Buttons"]; 
} 
@foreach (var button in buttons) { 
    <label class="radio inline"> 
     @Html.RadioButton(Html.NameForModel().ToHtmlString(), Model, Model == button["Value"], new { id = Html.IdForModel() }) @button["Label"] 
    </label> 
} 

這是我通過什麼我EditorFor額外ViewData

new { Buttons = new List<Dictionary<string, string>> { new Dictionary<string, string> { { "Label", "Commercial" }, { "Value", "Y" } }, new Dictionary<string, string> { { "Label", "Residential" }, { "Value", "N" } } } } 

授予我這個從我的控制器添加到視圖模型類型,並傳遞到視圖但是,在cshtml文件中執行該操作會更快。