为什么MVC会对不显眼的验证属性进行双重编码?

时间:2012-08-03 17:10:24

标签: asp.net asp.net-mvc

例如:

data-val-equalto="'MyProperty5' and 'MyProperty4' do not match."

问题:为什么&字符再次编码到&'),而不是按原样输出字符引用(')?

jquery.validate插件似乎正在将'解析为'

<小时/> 问题似乎不在Razor中,但是使用生成不显眼的验证属性的代码,以下代码:

<span title="@("'MyProperty5' and 'MyProperty4' do not match.")"></span>

...正确输出:

<span title="&#39;MyProperty5&#39; and &#39;MyProperty4&#39; do not match."></span>

<小时/> 发现问题出在ASP.NET MVC中,有一个名为GetValidationAttributes的方法,它将HTML编码的值添加到字典中,然后由TagBuilder再次编码这些值。很高兴知道他们为什么要这样做。

2 个答案:

答案 0 :(得分:3)

尝试使用Html.Raw方法输出。

否则,Razor 假设您正在尝试输出已编码的HTML并再次对其进行编码。

鉴于

string text = `Bread &amp; Breakfast`;

@text将输出为Bread &amp;amp; Breakfast,因为&amp;是HTML编码

@Html.Raw(text)将输出为“Bread&amp; Breakfast”

根据您的更新

更新

我无法告诉你为什么 jQuery Validate以这种方式工作,但是有一句古老的格言“如果你做X时会受伤,就停止做X”。

您不需要在输出HTML中对单引号进行编码。以下两个都产生相同的结果:

<span title="&#39;MyProperty5&#39; and &#39;MyProperty4&#39; do not match.">
Span With Encoded Title
</span>
<br />
<span title="'MyProperty5' and 'MyProperty4' do not match.">
Span With non-Encoded Title
</span>

答案 1 :(得分:0)

此问题已在MVC v4上修复。