Asp.net mvc Razor XHTML“&&引用;字符编码错误
我很喜欢这个新的视图引擎,最酷的特性之一就是所有东西都是默认编码的。但有件事我不明白, 假设我已经创建了这个HTML段落Asp.net mvc Razor XHTML“&&引用;字符编码错误,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我很喜欢这个新的视图引擎,最酷的特性之一就是所有东西都是默认编码的。但有件事我不明白, 假设我已经创建了这个HTML段落 <p> this is a test Paragraph for both Development & Production </p> 这是开发和生产的测试段落 现在,如果我检查firebug中的元素,我会得到 <p> this is a test Paragraph for both Developmen
<p>
this is a test Paragraph for both Development & Production
</p>
这是开发和生产的测试段落
现在,如果我检查firebug中的元素,我会得到
<p>
this is a test Paragraph for both Development & Production
</p>
这是一个测试段,用于开发和;生产
这是正确的,但如果我在浏览器中查看源代码
我明白了
这是开发和生产的测试段落
我尝试用W3C验证来验证页面,我得到的“&”字符错误是无效的
现在我的文件是我认为正确的
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11 /DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
我遗漏了什么?默认情况下,Razor将对它写入的所有内容进行编码,而不是对页面中的所有内容进行编码。由于P标记中的文本是HTML,因此不会对其进行任何编码 请看以下示例,以更好地了解差异:
<p>this is a test Paragraph for both Development & Production</p>
@{var body = "this is a test Paragraph for both Development & Production";}
<p>@body</p>
@{var body2 = new HtmlString("this is a test Paragraph for both Development & Production");}
<p>@body2</p>
这是一个针对开发和生产的测试段落
@{var body=“这是开发和生产的测试段落”;}
@身体
@{var body2=newhtmlstring(“这是开发和生产的测试段落”);}
@车身2
如果呈现此页面,您会注意到第一段不会被编码,而第二段会被编码,因为它正在编码变量的输出。然后,第三个示例将产生与第一个示例相同的输出,因为它使用特殊的HtmlString,该HtmlString假定输入是安全的
以下是Razor的输出,仅供参考:
<p>this is a test Paragraph for both Development & Production</p>
<p>this is a test Paragraph for both Development & Production</p>
<p>this is a test Paragraph for both Development & Production</p>
这是一个针对开发和生产的测试段落
这是一个测试段,用于开发和;生产
这是开发和生产的测试段落
默认情况下,Razor将对其写入的所有内容进行编码,而不是对页面中的所有内容进行编码。由于P标记中的文本是HTML,因此不会对其进行任何编码
请看以下示例,以更好地了解差异:
<p>this is a test Paragraph for both Development & Production</p>
@{var body = "this is a test Paragraph for both Development & Production";}
<p>@body</p>
@{var body2 = new HtmlString("this is a test Paragraph for both Development & Production");}
<p>@body2</p>
这是一个针对开发和生产的测试段落
@{var body=“这是开发和生产的测试段落”;}
@身体
@{var body2=newhtmlstring(“这是开发和生产的测试段落”);}
@车身2
如果呈现此页面,您会注意到第一段不会被编码,而第二段会被编码,因为它正在编码变量的输出。然后,第三个示例将产生与第一个示例相同的输出,因为它使用特殊的HtmlString,该HtmlString假定输入是安全的
以下是Razor的输出,仅供参考:
<p>this is a test Paragraph for both Development & Production</p>
<p>this is a test Paragraph for both Development & Production</p>
<p>this is a test Paragraph for both Development & Production</p>
这是一个针对开发和生产的测试段落
这是一个测试段,用于开发和;生产
这是开发和生产的测试段落
Razor将仅从@
块转义输出
您仍然需要自己避开文字标记。Firebug显示
&因为浏览器足够智能,可以正确解释无效的标记。Razor将仅从@
块转义输出
您仍然需要自己避开文字标记。
Firebug显示&代码>,因为浏览器足够智能,可以正确解释无效的标记。Firebug在查看器中显示某些内容时,会自动对其进行HTML编码。这是误导。查看源代码显示站点实际输出的内容。Firebug在查看器中显示某些内容时会自动对其进行HTML编码。这是误导。查看源代码可以显示站点实际输出的内容。我会首先检查“默认情况下所有内容都已编码”声明,因为它似乎有点不准确。在修改声明后,我会寻找一种准确的方法来确定您的视图实际呈现给客户端的内容,因此您不必猜测。我想到了卷发和小提琴手。@Pointy这句话怎么不准确?@marcind嗯,很明显,默认情况下它并没有对“一切”进行编码。我不是想暗示框架背后的好人在撒谎;我的意思是,OP可能误解了他们的文学作品。@Pointy good point。教程应该更清楚地说明这一点。我会首先检查“默认情况下所有内容都已编码”声明,因为它似乎有点不准确。在修改声明之后,我会寻找一种准确的方法来确定您的视图实际呈现给客户端的内容,因此您不必猜测。我想到了卷发和小提琴手。@Pointy这句话怎么不准确?@marcind嗯,很明显,默认情况下它并没有对“一切”进行编码。我不是想暗示框架背后的好人在撒谎;我的意思是,OP可能误解了他们的文学作品。@Pointy good point。教程应该更清楚这一点,但事实并非如此。浏览器正在自动修复无效的标记;Firebug只是在重复DOM。这不完全正确。浏览器正在自动修复无效的标记;Firebug只是在重复DOM。谢谢,但是有没有一种方法可以在默认情况下对页面中的所有内容进行编码?它是@block或normal P或任何HTML元素block?没有,Razor被设计成一个非常简单的视图引擎,可以扩展HTML。这意味着仍然需要编写有效的HTML。如果您需要人们编写HTML,但不知道什么是有效的或无效的,那么您应该在签入之前构建一个简单的CMS类型功能或运行某种HTML验证程序。谢谢,但是有没有一种方法可以对页面中的所有内容进行默认编码?它是@block或normal P或任何HTML元素block?没有,