Вставить MvcHtmlString, содержащий <script> с Javascript

Следующий метод встраивания некоторых Html из string в <div> с Javascript (используя некоторые JQuery) работает:

var div = $('#someId');
var testHtml = '<script></script><div>dummy Content</div>';
div.html(testHtml);

HTML-код внедряется и отображается в div. Если я положу некоторые alert('Test')заявление в <script> теги, предупреждение будет отображаться.

Что также работает, это:

<div id="someId">@MvcHtmlString.Create("<script></script><div>dummy Content</div>")</div>

Однако мне нужно пройти MvcHtmlString к функции JavaScript, а затем вставьте эту строку с JavaScript.

Это работает, если в строке нет кода javascript:

var div = $('#someId');
var inputItem = '@MvcHtmlString.Create("<div>dummy Content</div>")';
div.html(inputItem);

Однако, если в строке есть содержимое javascript, <script>-part не внедряется, и контент не отображается должным образом.

Так что это не работает должным образом:

var div = $('#someId');
var inputItem = '@MvcHtmlString.Create("<script></script><div>dummy Content</div>")';
div.html(inputItem);

Может кто-нибудь объяснить, почему это не работает? Есть ли простой трюк с этим?

3 ответа

Решение

Я не знаю, в каком браузере вы тестировали (я тестировал в IE8 и Chrome22), но ваш оригинальный пример также не работает:

var div = $('#someId');
var testHtml = '<script></script><div>dummy Content</div>';
div.html(testHtml);

Проверь это JSFiddle

Потому что вы не можете иметь "</script>" внутри строки JS, потому что браузеры интерпретируют его как закрывающий <script> тег. Посмотрите этот вопрос: тег Script в строке JavaScript

Так что решение для вас одинаково, поэтому не </script> внутри строки:

<script type="text/javascript">
    var div = $('#someId');
    var testHtml = '@MvcHtmlString.Create("<script>alert(\"test\");</sc' + 'ript><div>dummy Content</div>")';
    div.html(testHtml);
</script>

Вы также можете проверить это в действии в этом JSFiddle,

MvcHtmlString.Create Метод создает кодированный HTML-код и удаляет теги HTML-сценария.

использование @Html.Raw("htmlstring") чтобы дать вам необработанное значение HTML строки, не удаляя теги.

var div = $('#someId');
var inputItem = '@Html.Raw("<script></script><div>dummy Content</div>")';
div.html(inputItem);

Добавление поддельного типа атрибута в тег сценария, отличный от экранированного содержимого " text/javascript". Пример:

var inputItem = '@MvcHtmlString.Create("<script type="text"></script><div>dummy Content</div>")';

Удалите позже этот атрибут может сделать трюк. Но так как я понятия не имею, как работает MvcHtmlString, я действительно не уверен, что это может быть решением здесь.

Другие вопросы по тегам