Мне было интересно, как MVC определяет «вложенные» имена полей и идентификаторы.Потребовалось немного изучить исходный код MVC, чтобы выяснить это, но я думаю, что у меня есть хорошее решение для вас.
Как EditorTemplates и DisplayTemplates определяют имена и идентификаторы полей
С введениемВ EditorTemplates и DisplayTemplates в инфраструктуру MVC добавлена ViewData.TemplateInfo
, которая содержит, помимо прочего, текущий «префикс поля», например "Items[1]."
.Вложенные шаблоны используют это для создания уникальных имен и идентификаторов.
Создайте наши собственные уникальные идентификаторы:
Класс TemplateInfo
содержит интересный метод, GetFullHtmlFieldId
.Мы можем использовать это для создания наших собственных уникальных идентификаторов, например:
@{string id = ViewData.TemplateInfo.GetFullHtmlFieldId("fieldName");}
@* This will result in something like "Items_1__fieldName" *@
Для выигрыша
Вот как добиться правильного поведения для вашего примера:
<table>
<tr>
@{string id = ViewData.TemplateInfo.GetFullHtmlFieldId("radioTrue");}
<td>@Html.RadioButtonFor(i => i.Value, "1", new{id})</td>
<td>@Html.LabelFor(i => i.Value, "true", new{@for=id})</td>
</tr>
<tr>
@{id = ViewData.TemplateInfo.GetFullHtmlFieldId("radioFalse");}
<td>@Html.RadioButtonFor(i => i.Value, "0", new{id})</td>
<td>@Html.LabelFor(i => i.Value, "false", new{@for=id})</td>
</tr>
</table>
Что даст вам следующий HTML-код:
<table>
<tr>
<td><input id="Items_1__radioTrue" name="Items[1].Value" type="radio" value="1" /></td>
<td><label for="Items_1__radioTrue">true</label></td>
</tr>
<tr>
<td><input checked="checked" id="Items_1__radioFalse" name="Items[1].Value" type="radio" value="0" /></td>
<td><label for="Items_1__radioFalse">false</label></td>
</tr>
</table>
Отказ от ответственности
Синтаксис моего Razor недостаточно развит, поэтому, пожалуйста, дайте мне знать, если этот код имеет синтаксические ошибки.
Длясколько стоит
Очень жаль, что эта функция не встроена в RadioButtonFor
.Кажется логичным, что все визуализированные радиокнопки должны иметь идентификатор, который является комбинацией его name
И value
, но это не так - возможно, потому что это будет отличаться от всех других помощников HTML.
Создание вашегособственные методы расширения для этой функциональности тоже кажутся логичным выбором.Тем не менее, может быть сложно использовать «синтаксис выражения» ... поэтому я бы рекомендовал перегрузить .RadioButton(name, value, ...)
вместо RadioButtonFor(expression, ...)
.И вам может потребоваться перегрузка и для .Label(name, value)
.
Я надеюсь, что все это имело смысл, потому что в этом абзаце много "пробелов".