Ответ 1
Выбирается второй параметр, поэтому используйте! для выбора значения no, когда логическое значение false.
<%= Html.RadioButton("blah", !Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
Кто-нибудь знает, как привязать переключатель "Да/Нет" к логическому свойству сильно типизированной модели в ASP.NET MVC.
Model
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>
Выбирается второй параметр, поэтому используйте! для выбора значения no, когда логическое значение 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
то, что переключатели в целом не могут быть программно определены.
Model
public class MyModel
{
public bool IsMarried { get; set; }
}
Просмотр
<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
строковыми значениями.
Немного откликнувшись от ответа Ben, я добавил атрибуты для ID, чтобы использовать метки.
<%: 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>
Вы можете вызвать редактор для свойства, вручную указав имя шаблона в Вид:
@Html.EditorFor(Function(model) model.LikesCats, "YesNoRadio")
Плюсы:
В итоге я упаковал это в метод расширения, поэтому (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")