我有一些JavaScript用于下拉列表,可以在产品广告资源页面上对结果进行排序。在Internet Explorer中,排序工作正常,浏览器处理完美。但是在Chrome中它每次都会失败(你能相信它,有些东西可以在IE浏览器中运行而不是Chrome吗?)
在IE中,当我使用Sort By选项时,URL如下所示:
MyExampleSite.com/Supplies/Products/12345/MyProduct/?a=0
但是,当我在Chrome中执行“排序依据”选项时,URL就是这样的:
MyExampleSite.com/Supplies/Products/12345/MyProduct / &安培;安培; A = 0
正如您所看到的,它会在网址中添加放大器,如果我不断尝试对其进行排序,则只需每次添加一个额外的放大器。
以下是导致我的问题的JavaScript:
$("[name=a]").change(function () {
window.location = '@(this.Model.SortUri)' + '@(this.Model.SortUri.IndexOf('?') == -1 ? "?" : "&")a=' + this.value;
});
我的解决方案是添加Html.Raw
,如下所示:
$("[name=a]").change(function () {
window.location = '@(this.Model.SortUri)' + '@Html.Raw(this.Model.SortUri.IndexOf('?') == -1 ? "?" : "&")a=' + this.value;
});
突然它在IE和Chrome中运行良好。
我的问题是为什么Chrome会这样做而不是IE?
答案 0 :(得分:5)
嗯,你需要确保所有的东西都编码正确,我猜你不是。我们需要看到更多的页面才能确定。 IE可能检测到您已经错误地完成了它并尝试为您修复它,而Chrome不会自动修复您的错误。
当你做什么并且不需要逃避东西的规则时,它变得相当复杂。它位于HTML页面中,每个人都知道你需要逃避&在HTML网页中,但它是在脚本标记中,您还是不需要逃避它?那取决于你是否也在CDATA元素中有脚本标签。
简单的解决方案是避免这样做。将要切换的URL放在[name = a]元素上作为数据标记,如下所示:
<sometag name='a' data-urlprefix='@(this.Model.SortUri)@(this.Model.SortUri.IndexOf('?') == -1 ? "?" : "&")a='>stuff</sometag>
然后在你的javascript中:
$("[name=a]").change(function () {
window.location.href = $(this).data('urlprefix')+encodeURIComponent(this.value);
});
这也有将服务器处理内容移动到HTML部分的好处,这样你就可以将javascript放在它自己的文件中,无论如何你应该这样做。
this.value
进行了网址编码,那么我已经完成了。{li>如果它已经编码,您可以安全地删除它。我也将window.location改为window.location.href,因为window.location有时也会做一些奇怪的事情 - 在某些浏览器上编码,但在其他浏览器上没有,等等。答案 1 :(得分:4)
你只需要将整个字符串作为Html.Raw的一部分(在外面构建逻辑并在此处直接插入该变量)
请查看这篇文章
Why is Html.Raw escaping ampersand in anchor tag in ASP.NET MVC 4?