Я столкнулся с той же проблемой. Задание идентификаторов вручную, похоже, является единственным решением. Если вам не нужны идентификаторы для чего-либо (например, javascript), но вы хотите, чтобы они были уникальными, вы можете сгенерировать для них Guids:
<%: Html.RadioButton("", UserType.Primary, Model == UserType.Primary, new { id="radio" + Guid.NewGuid().ToString()}) %>
Более элегантное решение - создать собственный метод расширения на HtmlHelper
, чтобы отделить логику создания идентификатора от представления. Что-то вроде:
public static class HtmlHelperExtensions
{
public static MvcHtmlString MyRadioButtonFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, bool value)
{
string myId = // generate id...
return htmlHelper.RadioButtonFor(expression, value, new {id=myId});
}
}
Вспомогательный метод может использовать данные ViewContext и Model для создания более значимых идентификаторов.
UPDATE:
Если вы используете EditorTemplates для рендеринга элемента управления следующим образом
<%= Html.EditorFor(m=>m.User, "MyUserControl") %>
Затем внутри MyUserControl.ascx (помещается в ~ / Views / Shared / EditorTemplates) вы можете использовать свойство ViewData.TemplateInfo.HtmlFieldPrefix
для доступа к идентификатору родительского элемента управления или Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId("MyPostfixPart")
для создания идентификатора с префиксом. Эти методы могут быть использованы в расширении помощника выше.
То же самое работает с элементами управления, отображаемыми с Html.Editor(...)
и Html.EditorForModel(...)
. В помощнике Html.Editor
вы также можете указать htmlFiledName вручную, если хотите.
Когда вы вставляете элемент управления с помощью
<%= Html.Partial("UserControl", Model.User) %>
генерация значимых идентификаторов сложнее, поскольку Html.Partial не будет предоставлять информацию о префиксе - ViewData.TemplateInfo.HtmlFieldPrefix
всегда будет пустым. Тогда единственное решение состоит в том, чтобы передать префикс вручную в элемент управления ascx в качестве ключа ViewData в качестве поля модели, что не такое элегантное решение, как предыдущее.