mvc bind / post логическое для radiobutton - PullRequest
9 голосов
/ 06 мая 2010

В моей модели есть столбец с логическим значением NULLABLE. Теперь в моем представлении (для редактирования) я хотел бы привязать это к двум радиокнопкам: Да и Нет. Если значение равно нулю, просто отключите две радиокнопки. Как бы я пошел, чтобы сделать это?

Спасибо.

Ответы [ 4 ]

22 голосов
/ 06 мая 2010

После того, как вы выбрали радиокнопку, отменить ее (как пользователь) действительно невозможно. Я бы посоветовал вам, если вам действительно нужен трехзначный результат, чтобы у вас было три переключателя - да, нет, все равно.

<%= Html.LabelFor( m => m.Foo ) %>
<%= Html.RadioButtonFor( m => m.Foo, "true" ) %> Yes
<%= Html.RadioButtonFor( m => m.Foo, "false" ) %> No
<%= Html.RadioButtonFor( m => m.Foo, string.Empty ) %> Don't Care
<%= Html.ValidationMessageFor( m => m.Foo ) %>
3 голосов
/ 31 января 2014

Я могу опоздать с этим постом, однако вот мое решение, которое также обрабатывает настройку значений. Для этого использовался шаблон редактора. Вам нужно будет указать имя шаблона редактора. Я назвал мой 'NullableBool'

@model bool?

@{

Layout = null;

IDictionary<string, object> yesAttributes = new Dictionary<string, object>();
IDictionary<string, object> noAttributes = new Dictionary<string, object>();
IDictionary<string, object> naAttributes = new Dictionary<string, object>();

if (Model.HasValue)
{
    if (Model.Value)
    {
        yesAttributes.Add("checked", "checked");
    }
    else
    {
        noAttributes.Add("checked", "checked");
    }
}
else
{
    naAttributes.Add("checked", "checked");
}
}

@Html.RadioButtonFor(m => m, "true", yesAttributes) Yes`

@Html.RadioButtonFor(m => m, "false", noAttributes) No`

@Html.RadioButtonFor(m => m, string.Empty, naAttributes) N/A`
3 голосов
/ 21 августа 2012

Использование нескольких Html.RadioButtonFor (m => m.Foo, "true"), по-видимому, генерирует недопустимый HTML, поскольку он генерирует элементы управления с одинаковыми идентификаторами:

<input **id="Foo"** ... type="radio" value="True">
<input **id="Foo"** ... type="radio" value="False">

Я решил это, установив переключатели прямо в html:

<input type="radio" name="Foo" value="true" id="Foo_True"
       <%:Html.WriteCheckedIfTrue(Model.Foo.HasValue && Model.Foo.Value)%>/>
       <label for="Foo_True">Yes</label><br/>

<input type="radio" name="Foo" value="false" id="Foo_False" 
       <%:Html.WriteCheckedIfTrue(Model.Foo.HasValue && !Model.Foo.Value)%>/> 
       <label for="Foo_False">No</label><br/>

<input type="radio" name="Foo" value="" id="Foo_Null" 
       <%:Html.WriteCheckedIfTrue(!Model.Foo.HasValue)%>/> 
       <label for="Foo_Null">Don't Care</label>

убедитесь, что назвали переключатели в соответствии с используемой моделью представления, например: Model.Filter.HasImage названо: Filter.HasImage для работы с привязкой модели

«html helper» выглядит так:

    public static MvcHtmlString WriteCheckedIfTrue(this HtmlHelper htmlHelper, 
                                                   bool validation)
    {
        if(validation)
            return new MvcHtmlString("checked=\"checked\"");

        return new MvcHtmlString(string.Empty);
    }
1 голос
/ 16 сентября 2015

Это бритвенное решение проблемы.Это очень старый вопрос ASP.

Проблема в том, что вам нужно установить атрибут checked, потому что Html.RadioButtonFor не проверяет переключатель на основе обнуляемого bool (что, по-видимому, является недостатком).).

Также, установив переключатели внутри тега метки, вы можете выбрать значение, щелкнув метку.

Shared / EditorTemplates / Boolean.cshtml

@model bool?
<label>
    <span>n/a</span>
    @Html.RadioButtonFor(x => x, "", !Model.HasValue ? new { @checked=true } : null) 
</label>
<label>
    <span>Yes</span>
    @Html.RadioButtonFor(x => x, true, Model.GetValueOrDefault() ? new { @checked = true } : null)
</label>
<label>
    <span>No</span>
    @Html.RadioButtonFor(x => x, false, Model.HasValue && !Model.Value ? new { @checked = true } : null)
</label>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...