Переключатель генерирует дублирующиеся идентификаторы HTML

Кажется, что помощник ASP.NET MVC2 Html по умолчанию генерирует дублирующиеся идентификаторы HTML при использовании кода как этот (EditorTemplates/UserType.ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<UserType>" %>

<%: Html.RadioButton("", UserType.Primary, Model == UserType.Primary) %>
<%: Html.RadioButton("", UserType.Standard, Model == UserType.Standard) %>
<%: Html.RadioButton("", UserType.ReadOnly, Model == UserType.ReadOnly) %>

HTML это продукты:

<input checked="checked" id="UserType" name="UserType" type="radio" value="Primary" /> 
<input id="UserType" name="UserType" type="radio" value="Standard" /> 
<input id="UserType" name="UserType" type="radio" value="ReadOnly" /> 

Это ясно показывает проблему. Таким образом, я должен неправильно использовать Помощника или что-то.

Я могу вручную указать id как атрибут HTML, но затем я не могу гарантировать, что это будет уникально.

Таким образом, вопрос состоит в том, как удостовериться, что идентификаторы, сгенерированные помощником RadioButton, уникальны для каждого значения и все еще сохраняют конвенции для генерации тех идентификаторов (таким образом, вложенные модели уважают? (Предпочтительно не генерация идентификаторов вручную.)

35
задан Yuck 9 October 2013 в 01:16
поделиться

1 ответ

Я столкнулся с той же проблемой. Указание идентификаторов вручную кажется единственным решением. Если вам не нужны идентификаторы для чего-либо (например, 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 для создания более значимых идентификаторов.

ОБНОВЛЕНИЕ:

Если вы используете EditorTemplates для рендеринга такого элемента управления

<%= Html.EditorFor(m=>m.User, "MyUserControl") %>

Затем внутри MyUserControl.ascx (размещенный в ~ / Views / Shared / EditorTemplates), вы можете использовать свойство ViewData.TemplateInfo.HtmlFieldPrefix для доступа к идентификатору родительского элемента управления или Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId ("MyPostfix" ) для генерации идентификатора с префиксом. Эти методы можно использовать во вспомогательном расширении выше. То же самое работает с элементами управления, отображаемыми с помощью Html.Editor (...) и Html.EditorForModel (...) . В помощнике Html.Editor вы также можете указать htmlFiledName вручную, если хотите.

При встраивании элемента управления с

<%= Html.Partial("UserControl", Model.User) %>

создание значимых идентификаторов становится сложнее, поскольку Html.Partial не предоставляет информацию о префиксе - ViewData.TemplateInfo.HtmlFieldPrefix всегда будет пустым. Тогда единственным решением было бы передать префикс вручную в элемент управления ascx в качестве ключа ViewData в качестве поля модели, что не является таким элегантным решением, как предыдущее.

12
ответ дан 27 November 2019 в 15:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: