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