2012-08-20 2 views
6

Я несколько раз царапаю голову об этом в течение нескольких дней, и я не уверен, что это проблема с моей средой или сам код, основываясь на ASP. .NET MVC (хотя у меня 5 лет опыта работы на C#). Я использую недавнюю чистую установку Win7x64 и VS 2008 со всеми исправлениями.ASP.NET MVC Передача сырого HTML из контроллера на просмотр

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

ViewData["HTMLData"] = DAO.HTMLDataGet(); 

Когда я вижу выход, он маскируется/HTML кодировка. Я попытался с помощью следующих, все из которых, похоже, не решить эту проблему:

<%: HttpUtility.HtmlDecode(ViewData["HTMLData"].ToString())%> 

И ...

<%: Server.HtmlDecode(ViewData["HTMLData"].ToString())%> 

И ...

<%: Html.Raw(ViewData["HTMLData"].ToString())%> 

... она захватывает необработанный HTML из таблицы базы данных просто прекрасен, однако он продолжает форсировать эту взорванную кодировку независимо от того, что я пытаюсь сделать. Из того, что я читал в MSDN, была нотная заметка о проблемах, возникающих из-за неправильного декодирования HTML-кода, содержащего пробелы (что делает мой). Поскольку я сомневаюсь, что я единственный, кто столкнулся с этим, я обращаюсь к вам за некоторыми идеями.

Я собираюсь Kludge мой путь, хотя он с регулярным выражением, чтобы сделать очистку страницы, но подумал, что лучше сначала получить совет от некоторых других людей, прежде чем я переберу его силу. Спасибо заранее.

+0

- это все содержимое html, которое должно быть возвращено в представление? – bhuvin

+0

Я считаю, что решил тайну. Я использовал <%: %> вместо <%= %> - последний решает проблему. Для Microsoft, пытаясь сделать что-то легкое, они сделали чертовски много глупых решений с ASP.Net, таких как эта и другая бесполезная псевдо-разметка. – Dave

+0

Используя что-то 111Eleven – Oleg

ответ

12

<%:означает "при необходимости кодировать". Если вы не хотите этого, то ленивый подход будет использовать <%=, но, честно говоря, я предлагаю вам вместо того, чтобы обернуть его в IHtmlString, например:

string yourEncodedHtml = ... 
var html = new MvcHtmlString(yourEncodedHtml); 

Теперь, если вы храните что и показать его, он должен взять html «как есть».

+0

Спасибо за объяснение, почему это решение работает .. просто откровенно немой ИМХО, они настроили его таким образом. – Dave

+2

@ пользователь1611050 er, почему? Практически в любое время, когда вы что-то выдаете, * правильная * вещь заключается в ее кодировании. Теперь подумайте о том, какое влияние это имеет место, если вы ошибетесь *: двойное кодирование ** намного предпочтительнее (и гораздо более очевидно), чем эксплойт xss. –

8

Попробуйте использовать: <% =%>

<%= Html.Raw(ViewData["HTMLData"].ToString())%> 

<%:%> является Синтаксис для кодирования HTML вывода в ASP.NET 4 (и ASP.NET MVC)

For More Details

Как HTML кодировать контент сегодня

Приложения ASP.NET (особенно те, которые используют ASP.NET MVC) часто полагаются на использование <% =%> выражения для самопроизвольного вывода кода. Разработчики сегодня часто используют вспомогательные методы Server.HtmlEncode() или HttpUtility.Encode() в этих выражениях, чтобы HTML кодировал вывод перед его визуализацией.

В то время как это работает хорошо, есть два Недостатков него:

Это немного многословные Разработчиков часто забывают вызвать метод Server.HtmlEncode - и нет простого способа проверить его использование через приложение

новый <%:%> код Nugget синтаксис

С ASP.NET 4 мы вводим новый синтаксис выражений кода ( <%:%>), который отображает вывод как <% =%> блоки do - но который также автоматически кодирует HTML, прежде чем делать это. Это устраняет необходимость явно кодировать содержимое HTML.

Мы выбрали синтаксис <%:%>, чтобы было легко быстро заменить существующие экземпляры блоков <% =%>. Он также позволяет вам легко найти свою базу кода для <% =%> элементов, чтобы находить и проверять все случаи, когда вы не используете кодировку HTML в своем приложении, чтобы убедиться, что у вас есть правильное поведение.

+0

Если вы вызываете 'HtmlRaw', то не имеет значения, используете ли вы' <%: 'vs' <% = ', и, таким образом, предпочтение будет по-прежнему относиться к' <%: '. Если первая строка была '<%: Html.Raw (...)%>, это было бы идеальным ответом на вопрос. –