Почему я получаю другой результат с той же функцией HtmlDecode ()? - PullRequest
1 голос
/ 27 января 2012

Это мой код:

string myText = "Wählen Sie bitte";
string myTextDecoded = HttpUtility.HtmlDecode(myText);
Response.Write(myTextDecoded);
ddAdulti.Items.Add(new ListItem(myTextDecoded, ""));

в первом случае (Response.Write) он печатает на моем HTML-документе:

Wählen Sie bitte

что правильно! Но в опции окна выбора он печатает, в моем HTML-документе:

Wählen Sie bitte

что неправильно (я декодировал ... с той же функцией).

Почему это поведение?

Ответы [ 2 ]

4 голосов
/ 27 января 2012

Исходя из вашего обновленного вопроса, я собираюсь сделать потенциально неверное предположение о вашем понимании.

Я предполагаю, что вы смотрите на источник HTML и не понимаете, почему строка кодируется в одном месте и не кодируется в другом.Объяснение довольно простое: серверные элементы управления автоматически кодируют свое содержимое , а Response.Write записывает необработанный вывод.Для этого есть причина: элементы управления на стороне сервера часто содержат пользовательский ввод , который по своей природе небезопасен , поэтому он автоматически кодируется для предотвращения межсайтовых скриптовых атак илив менее гнусных случаях пользовательский ввод просто разрушает вашу страницу.

В качестве примера представьте, что список не не кодирует содержимое, и вы сделали это:

ddAdulti.Items.Add(new ListItem("</select>", ""));
ddAdulti.Items.Add(new ListItem("An actual valid value", ""));

Конечным результатом будет то, что ваша разметка будет выглядеть примерно так:

<select>
    <option></select></option>
    <option>An actual valid value</option>
</select>

Как видите, это явно сломано.То, что вы в итоге получите, зависит от интерпретирующего браузера, но, скорее всего, это пустой выпадающий список.

Теперь, поскольку элементы управления do кодируют свое содержимое, разметка в конечном итоге будет:

<select>
    <option>&lt;/select&gt;</option>
    <option>An actual valid value</option>
</select>

и все работает хорошо.: -)

[edit]

Мне приходит в голову, что из моего примера, вероятно, не ясно, почему вы видите поведение с таким персонажем, как 'ä'.Это связано с тем, что многие кодировки символов не поддерживают умноженные буквы, поэтому для управляющих авторов, вероятно, проще всего просто кодировать все символы за пределами 7-битного набора символов ASCII.: -)

[править 2]

Мне становится ясно, что оригинальный пост на самом деле не описывает реальную проблему.Очевидно, что markzzz пытается получить незашифрованный HTML из базы данных и отобразить его как есть для клиента.Для этого уже существует элемент управления WebForms: LiteralControl.Он будет отображать то, что вы вставляете в него, в незашифрованном виде.

Тем не менее, я знаю, что я не знаю, как встроить это в DropDownList - посмотрите мое объяснение того, как рендеринг HTML может сломаться.Однако, если вы просто хотите отобразить список элементов, но не обязательно раскрывающийся список, вы можете использовать LiteralControl внутри Repeater или что-то подобное.

3 голосов
/ 27 января 2012

Вы можете написать оба варианта в HTML, и оба будут работать нормально (при условии, что документ правильно закодирован).Оба примера приведут к одному и тому же (действительному) HTML и выводу:

W&#228;hlen
Wählen

Не закодированные Umlauts недопустимы.Они эквивалентны их кодированным версиям.

Но если вы не кодируете их, кодировка вашей страницы должна поддерживать немецкие символы.UTF-8 делает.

Почему два варианта приводят к разному HTML?Response.Write не кодирует свои выходные данные, поэтому вы можете выводить HTML как "<b>x</b>".ListItems кодируют их текст, потому что вы все равно не можете вывести в них HTML.Не имеет смысла проходить через незашифрованный текст.

...