2011-12-02 14 views
5

Mam następujący model:RadioButtonFor nie wybierając wartość szablonów edytora

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

chcę domyślny płeć być kobietą, więc, że ustanowiony w akcji:

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

Wreszcie, widok renderuje wszystko w następujący sposób:

@model Person 

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

Wszystko działa zgodnie z oczekiwaniami. Teraz powiedzmy, że zamiast prostego pola tekstowego, chcę wyświetlić płeć jako bardziej intuicyjną parę przycisków radiowych. Więc robię następujący szablon i zapisać go do shared/EditorTemplates/Gender.cshtml:

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

końcu udekorować Płeć z [UIHint("Gender")].

płeć jest teraz prawidłowo wykonane z przycisków radiowych, co jest dobre, ale ...

Problem

Kobieta nie jest wstępnie wybrany jako wartości domyślnej i zamiast ja skończyć z dwa puste przyciski radiowe. Czy czegoś brakuje?

Co ciekawe, jeśli przeniesię RadioButtonFor z szablonu do widoku (zmieniając model => model na model => model.Gender), wszystko działa zgodnie z oczekiwaniami. Wiem, że jest to wykonalne obejście, ale te szablony są tak niesamowitą, uzależniającą wygodą, że wolałbym wyczerpać wszystkie możliwości, zanim wypuszczę je.

Odpowiedz

9

wiem, że jest brzydki, ale następujące może pracować:

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

Problem z pomocnika RadioButton jest to, że jeśli pierwszy argument jest null lub opróżnić zawsze będzie traktować je jako nie sprawdził co czyni ten pomocnik nieodpowiednie dla szablonów edytora.

Oto fragment kodu źródłowego MVC, który ilustruje to, co mam na myśli:

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

Jako alternatywę można użyć custom HTML helper aby wygenerować listę przycisków radiowych.

+0

+1 i odpowiedź. Pracował uczta! To nie jest tak brzydkie. Jeśli cokolwiek, wolę żyć z "brzydotą", jeśli uda mi się zachować moje '@ Html.EditorForModels()' s Dzięki!:) –

+0

Zgadzam się, że to nie jest brzydkie i działało na urok. – danludwig

+0

Wziąłem ten pomysł i rozszerzyłem go. Przekazuję ciąg > do mojego szablonu edytora, dodając ViewData, którego używam do tworzenia przycisków radiowych. Mój szablon wygląda tak: – davidbitton

0

Wziąłem tę ideę i rozszerzyłem ją. Przekażę szablon List<Dictionary<string,string>> do mojego szablonu edytora, dodając ViewData, którego używam do tworzenia przycisków radiowych. Mój szablon wygląda tak

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

to co ja przechodząc do mojego EditorFor jako dodatkowy ViewData

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

prawda mógłbym dodać do tego typu ViewModel i przekazać, że na widok z mojego kontrolera , jednak szybciej było to zrobić w pliku cshtml.

Powiązane problemy