怎样才能激活Razor Html编码?

时间:2014-01-23 12:12:15

标签: c# asp.net-mvc asp.net-mvc-4 razor html-entities

在Razor视图中,我有一个Javascript函数。此函数在参数中使用2个URLS String并调用AJAX来执行操作。 当我在Razor中生成Url字符串时,Razor会更改URL。就像将&更改为&并损坏我的URL地址中使用的查询字符串一样。在这种情况下,Html.Raw()也不起作用。

我该怎么办?

示例:

在我的Razor编辑器中:

<a href="#" style="color:#0564c1;" onclick="PopUpStart('POST','','',200,100,'@(Html.Raw(address+"/index/?id="+baseObject.Id+"&"+"type="+dataTypeInt))','@Html.Raw(address + "/cancel/?id="+baseObject.Id+"&type="+dataTypeInt )','ReloadPage',true);return false;">
    Edit
</a>

结果:

<a href="#" style="color:#0564c1;" onclick="PopUpStart('POST','','',200,100,'/PdfInstanceEdit/index/?id=1&amp;type=270','/PdfInstanceEdit/cancel/?id=1`&amp;`type=270','ReloadPage',true);return false;">
    Edit
</a>

URL地址如:

  

地址+ “/索引/ ID =?” + baseObject.Id + “&安培;” + “型=” + dataTypeInt

更改为:

  

/ PdfInstanceEdit /索引/?ID = 1 &amp;输入= 270

在其他世界角色& =&gt; &amp;

4 个答案:

答案 0 :(得分:0)

您应该按照评论中的建议使用Html.Raw(),请参阅documentation

如本thread所述,如果您对输出编码格式有特殊问题,可以使用HttpUtility.HtmlDecode()函数,请参阅documentation

@Html.Raw(HttpUtility.HtmlDecode(address+"/index/?id="+baseObject.Id+"&"+"type="+dataTypeInt))

但由于这可能是一个解决方案,我无法准确地解决你的问题......

答案 1 :(得分:0)

尝试将服务器代码和客户端字符串组合在属性的引号内通常是一个坏主意(即onclick =“something @(something())”)

最好只返回服务器端函数中的整个批次

以下是我将如何修改代码:

<a href="#" style="color:#0564c1;"                               
onclick="@Html.Raw(
  String.Format(
    "PopUpStart('POST','','',200,100,'{0}','{1}','ReloadPage',true);return false;"
    , Url.Action("index",address,new{id = baseObject.Id, type = dataTypeInt})
    , Url.Action("cancel",address,new{id = baseObject.Id, type = dataTypeInt})
  )
)"/>
Edit
</a>

还要注意@(Html.Raw())和@ Html.Raw()之间的区别 - 你应该使用后者!

答案 2 :(得分:0)

由于onClick等事件的直接分配在这些日子里不受欢迎,因此更好的方法是通过js:

为您的网页添加Id和dataTypeInt的隐藏字段:

@Html.HiddenFor(model=> model.Id)
@Html.Hidden("dataTypeInt ", dataTypeInt)

为您的主播添加ID:

<a href="#" style="color:#0564c1;" id ="editLink"> Edit </a>

然后你的脚本:

<script>

     $(document).ready(function () {
           readyLinks();
     });

     readyLinks = function(){
          var id = $('#Id).val();
          var dataType = $('#dataTypeInt').val();
          var indexUrl = '/PdfInstanceEdit/index?id=' + id + '&type=' + dataType;
          var cancelUrl = '/PdfInstanceEdit/cancel?id=' + id + '&type=' + dataType;

          $('#editLink).on('click', function(){
               PopUpStart('POST','','',200,100,indexUrl, cancelUrl,'ReloadPage',true);
               return false;
          });

     };

</script>

答案 3 :(得分:0)

友情提醒:如果您尝试将字符串放在 HTML属性中,则必须对该值进行两次编码。它必须首先进行Javascript编码,然后该结果必须是HTML编码的。如果您没有按正确的顺序执行这两种编码,则可能会无意中在您的网站中打开XSS漏洞。

假设您要显示给客户端的字符串 s 。你将Razor标记写成:

&lt; a href =“#”onclick =“alert('Hello,@ HttpUtility.JavaScriptStringEncode(s)!')”&gt;点击我&lt; / a&gt;

注意对JavaScriptStringEncode的显式调用。然后Razor的@语法将自动HtmlEncode这个值,然后再将其写入响应。