Используете ли вы <%:%> или <% =%> для помощников HTML в ASP.NET MVC 2.0? - PullRequest
0 голосов
/ 18 мая 2010

Я знаю, что теперь они есть в ASP.NET MVC 2.0 <%: Model.CustomerName %>

Итак, когда вы создаете HTML-помощники, лучше ли использовать этот способ сейчас (при условии, что вы не хотите выполнять кодирование HTML)?

Ответы [ 2 ]

2 голосов
/ 18 мая 2010

Использование <%: %> следует использовать всякий раз, когда вы отображаете введенные / отправленные пользователем данные, чтобы сделать ваши веб-страницы более безопасными.

Но иногда HTML просто не подходит для кодирования всего. Что если вы хотите сохранить некоторое форматирование HTML? В этом случае вам придется использовать обычный оператор <%= %>. Давайте подумаем о примере, где это так.

Пример из реальной жизни

Допустим, у вас есть веб-контент, где пользователи могут оставлять свои комментарии. Вы хотели бы предоставить возможность сохранить некоторое форматирование (по крайней мере, разрывы строк). В этом случае вам придется сохранить элементы <br/> при последующем отображении этих комментариев. У вас есть два варианта:

  1. Очистка и форматирование комментариев при сохранении их в БД - в этом случае вы удалили бы все теги HTML из отправленных комментариев и затем заменили все новые строки (\ n) на <br/>. Если вы хотите отобразить этот комментарий, вы можете позвонить <%= Comment %>
  2. Очистка и форматирование комментариев при их отображении - в этом случае вы, скорее всего, назвали бы это <%= Html.Encode(Comment).Replace("\n", "<br/>") %>

Какой из них лучше / безопаснее, зависит от каждого конкретного случая, но очистка тегов HTML всегда является хорошим шагом для включения в любой из этих двух вариантов. Все также зависит от допустимого определения форматирования. Если они будут введены как обычные теги или что-то похожее на уценку, или что-то совершенно другое, зависит от вас, и код в конце наверняка будет зависеть от этого.

Преимущества / недостатки второго подхода

  • преимущество
    Допустим, вы предоставляете некоторые возможности форматирования, но примерно через год вы решаете изменить правила форматирования или что-то связанное с ними (что довольно часто встречается). Если вы используете второй подход, новые правила будут работать и со старыми комментариями, потому что они были сохранены как есть, в то время как первый подход потеряет свое значение со старыми данными. В качестве примера можно привести автоматическое определение веб-ссылок в этих комментариях на этапе очистки / форматирования. При первом подходе все ссылки в старых комментариях останутся не кликаемыми, но если использовать второй, даже более старые комментарии со ссылками отформатируют их как кликабельные.
  • минус
    Второй подход использует намного больше обработки, чем первый, потому что каждый комментарий должен быть предварительно обработан каждый раз, когда отображается, в то время как в первом подходе они обрабатываются только один раз, когда мы сохраняем их в БД. В зависимости от сложности форматирования / очистки и количества комментариев на каждой странице это может стать значительным.
    Если обработка действительно становится проблемой, вам следует подумать об альтернативе, использующей первый подход, но при очистке и переформатировании комментария вы сохраните обе версии в своей БД. Первоначально представленные комментарии, а также обработанные. Поэтому, когда вы меняете правила форматирования, вы всегда можете переформатировать старые комментарии, потому что вы сохранили оригиналы.
1 голос
/ 18 мая 2010

Да, вы всегда хотите использовать <%: Model.CustomerName %> отныне, где можете. Вы должны использовать <%= %> только в очень особых случаях, но стараться вообще его не использовать.

Если вы создаете свои собственные html-помощники, которые не хотите кодировать, просто верните MvcHtmlString из них.

например. Это метод расширения, который я создал для отображения значка галочки, если переданное значение равно true.

public static MvcHtmlString MECross(this HtmlHelper html, string value, string text)
{
    if (Convert.ToBoolean(value))
    {
        string spanTag = string.Format("<span class=\"replace icon-cross\" title=\"{0}\"><em></em>{1}</span>",
                                        html.AttributeEncode(text),
                                        html.Encode(text));

        return MvcHtmlString.Create(spanTag);
    }

    return MvcHtmlString.Empty;
}

Обратите внимание, что я Encode и AttributeEncode все, что может быть опасно в моем методе расширения, а затем возвращаю MvcHtmlString.

HTHS
Chares

...