Asp.net MVC4高级编程学习笔记-视图学习第二课Razor视图引擎20171010

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>&lt;script&gt;alert(&#39;alert&#39; &lt;/script&gt;</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标签打印显示到页面上,而不是弹出对话框,但又不能像默认那样出现转码符号&lt,&gt;,如有人知道还请告知,谢谢!

 

以上这种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输出转义符号@。

使用&#64或者两个@@符号转义输出@符号。

 

/////////////////////////////////////////////////////////////////////////////////////

Razor注释。

使用@* 注释内容 *@格式在视图文件中添加注释。

 

/////////////////////////////////////////////////////////////////////////////////////

Razor使用泛形方法需要整个代码使用圆括号括起来。

Example:

@(Html.someMethod<AType>())

 

 

后续视图布局单独再写一个学习笔记。

posted @ 2017-10-10 11:00  shuyisheng  阅读(377)  评论(0编辑  收藏  举报