ASP.NET MVC Html Helper не отображает идентификатор атрибута, когда имя начинается с цифры - PullRequest
0 голосов
/ 23 августа 2011

Я обнаружил странное поведение помощников HTML для меня.
Он отлично работает в MVC 1
Но есть проблемы в MVC 2 и MVC 3

Итак, у меня есть следующий макет:
в MVC 2:

<%= Html.Hidden("123Test", "Without ID") %>
<%= Html.Hidden("Test123", "With ID") %>

или в MVC 3:

@Html.Hidden("123Test", "Without ID")
@Html.Hidden("Test123", "With ID")

Они оба генерируют следующую разметку:

<input name="123Test" type="hidden" value="Without ID" />
<input id="Test123" name="Test123" type="hidden" value="With ID" />

Как видно из названия,начинается с номера, тогда ID не будет отображаться.

Итак, мой вопрос: существуют ли какие-либо настройки, которые отключают это поведение?
Или это может быть адресовано разработчикам MVC?

1 Ответ

3 голосов
/ 23 августа 2011

Они используют спецификацию HTML 4.01 , в которой говорится, что идентификатор не может начинаться с цифры

Жетоны ID и NAME должны начинаться с буквы ([A-Za-z]) и могут быть за которыми следует любое количество букв, цифр ([0-9]), дефисов ("-"), подчеркивания ("_"), двоеточия (":") и точки (".").

Код ошибки - это метод CreateSanitizedId() для TagBuilder

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.

public static string CreateSanitizedId(string originalId, string invalidCharReplacement) {
    if (String.IsNullOrEmpty(originalId)) { 
        return null;
    }

    if (invalidCharReplacement == null) { 
        throw new ArgumentNullException("invalidCharReplacement");
    } 

    char firstChar = originalId[0];
    if (!Html401IdUtil.IsLetter(firstChar)) { 
        // the first character must be a letter
        return null;
    }

    StringBuilder sb = new StringBuilder(originalId.Length);
    sb.Append(firstChar); 

    for (int i = 1; i < originalId.Length; i++) {
        char thisChar = originalId[i]; 
        if (Html401IdUtil.IsValidIdCharacter(thisChar)) {
            sb.Append(thisChar);
        }
        else { 
            sb.Append(invalidCharReplacement);
        } 
    } 

    return sb.ToString(); 
}

Для этого потребуется адрес, чтобы разрешить это при использовании HTML 5 предлагаемой спецификации , которая позволит идентификатору начинаться с цифры

Атрибут id указывает уникальный идентификатор (ID) своего элемента. значение должно быть уникальным среди всех идентификаторов в домашнем поддереве элемента и должен содержать хотя бы один символ. Значение не должно содержать любые пробелы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...