ASP.NET MVC Да / нет переключатели с сильно привязанной моделью MVC



кто-нибудь знает, как привязать переключатель Да / нет к логическому свойству строго типизированной модели в ASP.NET MVC.



модель



public class MyClass
{
public bool Blah { get; set; }
}


посмотреть



<%@  Page Title="blah"  Inherits="MyClass"%>
<dd>
<%= Html.RadioButton("blah", Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
</dd>


спасибо



устранение:



спасибо Брайану за направление, но это было противоположное тому, что он написал. Как же так -



<%@  Page Title="blah"  Inherits="MyClass"%>
<dd>
<%= Html.RadioButton("blah", !Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
</dd>
702   8  

8 ответов:

второй параметр выбран, так что используйте ! чтобы выбрать значение нет, когда логическое значение равно false.

<%= Html.RadioButton("blah", !Model.blah) %> Yes 
<%= Html.RadioButton("blah", Model.blah) %> No 

Если вы используете MVC 3 и Razor, вы также можете использовать следующее:

@Html.RadioButtonFor(model => model.blah, true) Yes
@Html.RadioButtonFor(model => model.blah, false) No

вот более полный пример использования fieldset по соображениям доступности и выбрав первую кнопку по умолчанию. Без fieldset, что переключатели для в целом не может быть программно определено.

модель

public class MyModel
{
    public bool IsMarried { get; set; }
}

View

<fieldset>
    <legend>Married</legend>

    @Html.RadioButtonFor(e => e.IsMarried, true, new { id = "married-true" })
    @Html.Label("married-true", "Yes")

    @Html.RadioButtonFor(e => e.IsMarried, false, new { id = "married-false" })
    @Html.Label("married-false", "No")
</fieldset>

вы можете добавить @checked аргумент для анонимного объекта, чтобы установить переключатель по умолчанию:

new { id = "married-true", @checked = 'checked' }

обратите внимание, что вы можете связать в строку путем замены true и false со строковыми значениями.

немного отталкиваясь от ответа Бена, я добавил атрибуты для идентификатора, чтобы я мог использовать метки.

<%: Html.Label("isBlahYes", "Yes")%><%= Html.RadioButtonFor(model => model.blah, true, new { @id = "isBlahYes" })%>
<%: Html.Label("isBlahNo", "No")%><%= Html.RadioButtonFor(model => model.blah, false, new { @id = "isBlahNo" })%>

Я надеюсь, что это помогает.

добавление тегов меток вокруг переключателей с помощью обычного HTML также исправит проблему "labelfor":

<label><%= Html.RadioButton("blah", !Model.blah) %> Yes</label>
<label><%= Html.RadioButton("blah", Model.blah) %> No</label>

при нажатии на текст теперь выбирается соответствующий переключатель.

или MVC 2.0:

<%= Html.RadioButtonFor(model => model.blah, true) %> Yes
<%= Html.RadioButtonFor(model => model.blah, false) %> No

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

допустим, у вас есть следующее свойство в вашем ViewModel:

Public Class ViewModel
    <Display(Name:="Do you like Cats?")>
    Public Property LikesCats As Boolean
End Class

вы можете выставить это свойство через многоразовый редактор шаблонов:

сначала создайте файл Views/Shared/EditorTemplates/YesNoRadio.vbhtml

добавьте следующий код YesNoRadio.vbhtml:

@ModelType Boolean?

<fieldset>
    <legend>
        @Html.LabelFor(Function(model) model)
    </legend>

    <label>
        @Html.RadioButtonFor(Function(model) model, True) Yes
    </label>
    <label>
        @Html.RadioButtonFor(Function(model) model, False) No
    </label>
</fieldset>

вы можете вызвать редактор свойства вручную, указав имя шаблона в папке View:

@Html.EditorFor(Function(model) model.LikesCats, "YesNoRadio")

плюсы:

  • получить, чтобы написать HTML в Редакторе HTML вместо добавления строк в коде позади.
  • сохраняет DisplayName DataAnnotation
  • позволяет нажимать на метку для переключения переключателя
  • минимально возможное код для поддержания в форме (1 линия). Если что-то не так с тем, как это рендинг, возьмите его с шаблоном.

Я закончил тем, что упаковал это в метод расширения, поэтому (1) я мог бы создать ярлык и радио сразу и (2) поэтому мне не пришлось суетиться с указанием моих собственных идентификаторов:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString RadioButtonAndLabelFor<TModel, TProperty>(this HtmlHelper<TModel> self, Expression<Func<TModel, TProperty>> expression, bool value, string labelText)
    {
        // Retrieve the qualified model identifier
        string name = ExpressionHelper.GetExpressionText(expression);
        string fullName = self.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);

        // Generate the base ID
        TagBuilder tagBuilder = new TagBuilder("input");
        tagBuilder.GenerateId(fullName);
        string idAttr = tagBuilder.Attributes["id"];

        // Create an ID specific to the boolean direction
        idAttr = String.Format("{0}_{1}", idAttr, value);

        // Create the individual HTML elements, using the generated ID
        MvcHtmlString radioButton = self.RadioButtonFor(expression, value, new { id = idAttr });
        MvcHtmlString label = self.Label(idAttr, labelText);

        return new MvcHtmlString(radioButton.ToHtmlString() + label.ToHtmlString());
    }
}

использование:

@Html.RadioButtonAndLabelFor(m => m.IsMarried, true, "Yes, I am married")

Comments

    Ничего не найдено.