【问题标题】:How Can DeActivate Razor Html Encoding ?如何停用 Razor Html 编码?
【发布时间】:2014-01-25 01:33:21
【问题描述】:

在 Razor 视图中,我有一个 Javascript 函数。该函数在参数中接受 2 个 URLS 字符串并调用 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 地址如:

address+"/index/?id="+baseObject.Id+"&"+"type="+dataTypeInt

改为:

/PdfInstanceEdit/index/?id=1&amp;amp;type=270

异世界角色&amp;amp; => &amp;amp;

【问题讨论】:

  • 使用Url.Action()...实际上更容易构造那个url
  • @Html.Raw 在这种情况下不起作用。
  • @user3227633 请发布您使用@Html.Raw() 的方式。我的好奇心在这个屋顶上。
  • @PatrykĆwiek 如何在 Url.Action() 中调用 java 脚本函数?
  • @MABDigital 你不调用Javascript in Url.ActionUrl.Action 仅返回一个字符串,该字符串表示控制器和操作的地址以及您将提供的所有路由参数,here you have an example

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


【解决方案1】:

尝试在属性的引号内组合服务器代码和客户端字符串通常是个坏主意(即 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() 之间的区别——你应该使用后者!

【讨论】:

  • 谢谢,我更改了我的RouteConfig.cs 并解决了您的回答问题
【解决方案2】:

由于这些天直接分配诸如 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】:

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

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

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

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

【讨论】:

  • 感谢@cubitouch,但返回相同的结果。 Razor 已更改 & 为 '& amp;'。
【解决方案4】:

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

假设您有一个字符串 s 想要显示给客户端。您可以将 Razor 标记编写为:

点我

注意对 JavaScriptStringEncode 的显式调用。然后 Razor 的 @ 语法会在将此值写入响应之前自动 HtmlEncode。

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2018-03-27
    • 1970-01-01
    • 2016-10-10
    相关资源
    最近更新 更多