ASP.NET MVC Textarea HTML помощник добавления строк при использовании AntiXssLibrary - PullRequest
5 голосов
/ 24 июня 2011

Я заметил наиболее досадную (возможную) ошибку в ASP.NET MVC TextAreaFor HTML helper.По какой-то причине помощник HTML добавляет NewLine перед любым содержимым в текстовой области.По-видимому, это делается для того, чтобы бороться с возможной проблемой контента отдельного человека, начинающегося с новой строки, и браузер игнорирует его согласно спецификации.

Однако, добавив его, я получаю НАМНОГО более раздражающую ошибку,теперь во всех моих текстовых областях автоматически добавляется дополнительная строка перед любым содержимым при загрузке формы (т.е. это отображается перед любым содержимым в моем поле:).Может показаться, что что-то кодирует «новую строку», прежде чем выплевывать.

У кого-нибудь есть обходной путь для этого?Я ожидаю, что предполагаемое поведение - распечатать

    <textarea>
    Stuff</textarea>

, а не

    <textarea>&#13;&#10;Stuff</textarea>

Я получаю ...

Редактировать При дальнейшей проверке выясняется, что это связано с тем, что я использовал AntiXssLibrary для кодирования вместо стандартного HtmlEncoder.Я использую версию 4.0, и мой метод класса кодировщика выглядит следующим образом:

    protected override void HtmlEncode(string value, TextWriter output)
    {
        output.Write(Microsoft.Security.Application.Encoder.HtmlEncode(value));
    }

Итак, моя МНЕНИЕ заключается в том, что, поскольку класс TagBuilder, который вызывается из TextAreaHelper, HTML кодирует содержимое тега, онпринимает на себя поведение HTML-кодировщика по умолчанию, но AntiXssLibrary более тщательно, и, таким образом, вы видите это поведение?

1 Ответ

8 голосов
/ 25 июня 2011

После некоторого копания кода я обнаружил, что моя мысль верна.HTML-помощник MVC3 TextArea использует класс TagBuilder и выполняет следующие действия:

tagBuilder.SetInnerText(Environment.NewLine + value);

Когда SetInnerText вызывает HttpUtility.Encode для содержимого переданного ему аргумента, это приводит к тому, что кодировщик по умолчанию вызывается не простодля фактического VALUE, но также и для этого Environment.NewLine, что означает, что если вы не используете HtmlEncoder по умолчанию (например, вместо AntiXssLibrary), может произойти непредвиденное поведение, подобное этому.

Исправлениевместо этого им нужно было бы позвонить:

tagBuilder.InnerHtml = Environment.NewLine + HttpUtility.Encode(value);

Я отправил отчет об ошибке.

В то же время я внедряю исправление Javascript onLoad для удаления кодировки, нарушающей работу, из всех текстовых областей.:

$("textarea").each(function () { $(this).val($(this).val().trim()); });
...