cshtml / vbhtml и новый @ для включения данных на стороне сервера, но без кодировки? - PullRequest
0 голосов
/ 06 января 2012

Я начал изучать MVC и вместе хочу использовать KnockOut.js

У меня проблемы с пониманием того, почему новый тег @ include кодирует все в HTML (edit: хорошо, теперь я знаю, чтобы предотвратить XSS)... но еще хуже, как остановить это от этого ..

У меня есть этот код.

@{
    ViewBag.Title = "Home Page";
    var myData = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model);
}

<script type="text/javascript">
    var initialData =  @myData ;

Который производит этот источник

<script type="text/javascript">

var initialData =  [{&quot;Title&quot;:&quot;Tall Hat&quot;,&quot;Price&quot;:49.95},{&quot;Title&quot;:&quot;Long Cloak&quot;,&quot;Price&quot;:78.25}] ;

Хорошо.поэтому попытался использовать HttpUtility.HtmlDecode .. и ничего не происходит с включенным битом в javascript, потому что бритвенный механизм перекодирует его?но если он использует кодирование, то повторно кодирует кодирует html .. briallinat.

Я не могу понять, как остановить кодировку.

MSDN говорит, что использовать @:, но это не работает вблок javascript, я даже пытался @{ @:new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model);}

Это просто что-то странное и вызывает другие ошибки.

Как это должно быть сделано в модели MVC?

В aspx используя

var initialData = <%= new JavaScriptSerializer().Serialize(Model) %>;

отлично работает ..

Ответы [ 2 ]

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

Html.Raw (string) запишет вашу строку в необработанном незашифрованном виде.При условии, что ваша строка не закодирована для начала.

пример кода по запросу (?!?!)

@{
    ViewBag.Title = "Home Page";
    var myData = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model);
}

<script type="text/javascript">
    var initialData =  @Html.Raw(myData) ;
1 голос
/ 06 января 2012

MVC (или механизм представления Razor в этом случае) кодирует все ваши строки в виде строки HTML, используя MvcHtmlString по умолчанию. Чтобы обойти это, используйте:

<script type="text/javascript">
    var initialData =  "@MvcHtmlString.Create(myData)";
</script>

Тогда предполагается, что ваша строка уже закодирована.

...