Razor视图引擎
1、常用写法
@标记代码的转换字符。
示例:
<h1>hello,it’s @users.count items.</h1> //这里会自动识别@users.count为代码块,用空格识别;
@{
String rootNameSpace=”MyApp”;
}
//////////////////////////////////////////////////////////////////
<span> @(rootNameSpace).Models</span>
//这里需要加括号,如果不加括号会识别.后面的Models为rootNameSpace的属性这样会报错。
/////////////////////////////////////////////////////////////////////////
一般电子邮件格式会自动识出来格式,为了防止歧义建议用@@来转义显示电子邮件中的@符号。如:abc@@126.com
如果有类似电子邮件的格式需要转换代码,如下需要增加括号来识别,比如:
<li>Item_@(item.length)</li> //如果去掉括号会当成电子邮件格式连代码一块输出来。
///////////////////////////////////////////////////////////////////////////
@foreach(item in items)
{
<li> The item is @item.</li> //这里会识别到.后面为<符号,不能组成有效的表达式,因此只会自动识别为@item。这个功能比较好。
}
/////////////////////////////////////////////////////////
如果语句中@符号,如微信中的@某个人,可以使用@@符号转义输出。如:
@@吴京,@@小s
2、 HTML编码
默认情况下Razor会自动编码,如:
@{
string message=”<script>alert(‘hello!’)</script>”
}
<span>@message</span>
这里在执行时不会弹出警告框,而会输出如下内容:
<span><script>alert('alert' </script></span>。
/////////////////////////////////////////////////////////////////////////
如果想显示Html标签到页面中,通过两种方式
1) 创建一个HtmlString 、mvcHtmlString实例或者直接调用mvcHtmlString.Create方法创建
Example:
@(new HtmlString("<script>alert('123')</script>")) //会弹出网页对话框123
@(new MvcHtmlString("<script>alert('123')</script>"))//会弹出网页对话框123
@MvcHtmlString.Create("<script>alert('123')</script>")//会弹出网页对话框123
2) 使用Html.Raw方法
@Html.Raw("<script>alert('123')</script>") //会弹出网页对话框123
思考:这里什么把Html标签打印显示到页面上,而不是弹出对话框,但又不能像默认那样出现转码符号<,>,如有人知道还请告知,谢谢!
以上这种Razor自动编码对于javascript脚本中来显示用户输出的信息来说安全性还是不够,如果用户信息参数中存在编码后的脚本标签还是可以攻击,因此在脚本中需要使用javascript编码而不仅仅是Html编码。需要使用@Ajax.JavaScriptStringEncode对用户输出信息进行编码。
Example:--这里注意我在Razor视图写的这一句好像没有执行js代码,页面预览效果还是显示Test,不知道有人知道在View中这样写存在的问题,提供下正确的解决方法,谢谢!
<div id="message">Test</div>
<script type="text/javascript">
$(function () {
var message = 'Hello,@Ajax.JavaScriptStringEncode(ViewBag.UserName)';
$("#message").html(message).show('slow');
});
</script>
--找到一种解决方案:
在_Layout.cshtml通用视图中添加节点 @RenderSection("scripts", required: false),然后在渲染的视图如下书写就可以正常执行js代码了,初步判断应该是页面加载先后顺序问题。
示例代码:
@section scripts
{
<script type="text/javascript">
$(function () {
var message = 'Hello,@Ajax.JavaScriptStringEncode(ViewBag.UserName)';
$("#message").html(message).show('slow');
});
</script>
}
/////////////////////////////////////////////////////////////////////////////////////
Razor支持代码块。
Example:
@foreach(var item in stuff)
{
<li>the item name is @item.</li>
}
这个代码块自动识别htrml内容,到右边的}号结束。
写成一行也可以识别,如:
@foreach (var item in stuff){ <li>the item name is @item.</li>}
多行代码块Example:
@{
string strName = "XiaoHua";
ViewBag.Title = "用户信息";
}
当调用没有反回值的方法值时,需要使用代码块。
Example:
@{Html.RenderPartial("AboutView");} //如果这里去掉花括号是报错的,提示void转为object。
/////////////////////////////////////////////////////////////////////////////////////
Razor混合代码和纯文本两种方式。
@if(showMessage)
{
<text>This is plain text.</text> //可以多行使用
}
@*或者*@
@if(showMessage)
{
@:This is plain text. //不过这里只能写一行文本,不能换行。
}
/////////////////////////////////////////////////////////////////////////////////////
Razor输出转义符号@。
使用@或者两个@@符号转义输出@符号。
/////////////////////////////////////////////////////////////////////////////////////
Razor注释。
使用@* 注释内容 *@格式在视图文件中添加注释。
/////////////////////////////////////////////////////////////////////////////////////
Razor使用泛形方法需要整个代码使用圆括号括起来。
Example:
@(Html.someMethod<AType>())
后续视图布局单独再写一个学习笔记。