cshtml / vbhtml和新的@包括服务器端数据,但没有编码?

时间:2012-01-06 12:37:50

标签: asp.net-mvc-3 razor knockout.js

我开始学习MVC,并且想要使用KnockOut.js

我无法理解为什么新的@include标记会将所有内容编码为HTML(编辑:好吧我现在知道要防止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 个答案:

答案 0 :(得分:4)

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 :(得分:1)

MVC(或本例中的Razor视图引擎)默认情况下使用MvcHtmlString将所有字​​符串编码为HTML字符串。要绕过它,请使用:

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

然后假设你的字符串已被编码。