Я искал решение о переключателях и связанных ярлыках. Мне нравится, как мы можем выбрать каждую радио-кнопку, нажав на ярлык, связанный. По умолчанию это работает не очень хорошо. Я имею в виду, что ярлыки неправильно связаны с переключателями.
Пример: Допустим, у нас есть свойство с именем Revoked с возможными значениями Да / Нет. Мы хотели бы использовать переключатели, чтобы позволить пользователю выбрать значение.
Проблема: когда HTML-теги генерируются из MVC (Html.LabelFor, Html.RadioButtonFor), идентификаторы обеих радиокнопок (Да / Нет) совпадают. Таким образом, невозможно связать каждую метку с соответствующей радиокнопкой.
Решение: Я создал свой собственный помощник для генерации HTML-тегов с правильным и уникальным идентификатором.
Вот мой помощник:
public static MvcHtmlString RadioButtonWithLabelFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, object labelText)
{
object currentValue = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model;
string property = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).PropertyName;
// Build the radio button html tag
TagBuilder htmlRadio = new TagBuilder("input");
htmlRadio.MergeAttribute("type", "radio");
htmlRadio.MergeAttribute("id", property + value);
htmlRadio.MergeAttribute("name", property);
htmlRadio.MergeAttribute("value", (string)value);
if (currentValue != null && value.ToString() == currentValue.ToString()) htmlRadio.MergeAttribute("checked", "checked");
// Build the label html tag
TagBuilder htmlLabel = new TagBuilder("label");
htmlLabel.MergeAttribute("for", property + value);
htmlLabel.SetInnerText((string)labelText);
// Return the concatenation of both tags
return MvcHtmlString.Create(htmlRadio.ToString(TagRenderMode.SelfClosing) + htmlLabel.ToString());
}
Это работает, но мне нужно посоветовать. Как вы думаете? Это эффективно? Я все еще новичок в мире ASP.NET MVC, поэтому любая помощь очень ценится.
Спасибо.