2011-12-02 22 views
5

I以下のモデルがあります: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")]と性別を飾ります。

性別が正しく素晴らしいですラジオボタン、でレンダリングされますが、...

問題

女性は、もはや前のデフォルト値として選択していますし、代わりに私がで終わります2つのラジオボタンが空白。何か不足していますか?

興味深いことに、RadioButtonForをテンプレートからビュー(model => modelからへ変更)に移動すると、すべて正常に動作します。私はこれが実行可能な回避策であることを知っていますが、これらのテンプレートヘルパーは、それらを行かせる前にすべての可能性をむしろ使い果たしてしまうような驚くほど中毒性のある便利なものです。

答えて

9

は、私はそれが醜いと知っているけど、次はうまくいくかもしれない:

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

のRadioButtonヘルパーの問題は、最初の引数がnullまたは空の場合以外は、このヘルパーは不適切作るので、チェックして、それは常にそれを検討するということですエディタテンプレート用。

は、ここで私が何を意味するかを示しているMVCのソースコードからの抜粋です:

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

代替として、あなたは、ラジオボタンのリストを生成するためにcustom HTML helperを使用することができます。

+0

+1と回答。治療に取り組んだ!どちらも醜いわけではない。もし私が '@ Html.EditorForModels()' 's Thanksを保つならば、私はむしろ "ugliness"で生活したいでしょう。:) –

+0

私はそれが醜いではないことに同意し、魅力を働いた。 – danludwig

+0

私はこのアイデアをとり、それを拡張しました。 List >をエディタテンプレートに渡し、ラジオボタンの作成に使用するViewDataを追加しました。私のテンプレートは次のようになります – davidbitton

0

私はこのアイデアを取り入れ、それを拡張しました。 List<Dictionary<string,string>>をエディタテンプレートに渡して、ラジオボタンの作成に使用するViewDataを追加しました。私のテンプレートは、これは私が追加ViewData私はViewModelに型にこれを追加して、私のコントローラからビューにそれを渡すことができます確かに

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

として私EditorForに渡しているものです。この

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

のように見えますしかし、cshtmlファイルでそれを行う方が速かったです。

関連する問題