RadioButton для не выбора значения в шаблонах редактора - PullRequest
5 голосов
/ 02 декабря 2011

У меня есть следующая модель:

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

Это все работает как положено. Теперь предположим, что вместо простого текстового поля я хочу отобразить пол в виде более интуитивной пары переключателей. Поэтому я делаю следующий шаблон и сохраняю его в Shared / EditorTemplates / Gender.cshtml:

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

Наконец я украшаю Пол с [UIHint("Gender")].

Пол теперь правильно отображается с помощью переключателей, что здорово, НО ...

Проблема

Самка больше не выбирается предварительно выбранной в качестве значения по умолчанию, и вместо этого я получаю две пустые радиокнопки. Я что-то упустил?

Интересно, что если я переместу RadioButtonFor из шаблона в представление (изменив model => model на model => model.Gender), то все будет работать как положено. Я знаю, что это жизнеспособный обходной путь, но эти шаблонные помощники настолько удивительны и вызывают привыкание, что я предпочел бы исчерпать все возможности, прежде чем отпустить их.

Ответы [ 2 ]

9 голосов
/ 02 декабря 2011

Я знаю, это ужасно, но может сработать следующее:

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

Проблема с помощником RadioButton заключается в том, что если первый аргумент является нулевым или пустым, он всегда будет считать его непроверенным, что делает этот помощник неподходящим для шаблонов редактора.

Вот выдержка из исходного кода MVC, иллюстрирующая, что я имею в виду:

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

В качестве альтернативы вы можете использовать пользовательский помощник HTML для генерации списка переключателей.

0 голосов
/ 22 августа 2012

Я взял эту идею и расширил ее.Я передаю 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" } } } }

Конечно, я мог бы добавить это к типу ViewModel ипередать это в View из моего контроллера, однако это было быстрее сделать в файле cshtml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...