zoukankan      html  css  js  c++  java
  • 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>())

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

  • 相关阅读:
    C++Vector使用方法
    Struts2学习笔记1
    全排列算法及实现
    概率图模型(PGM)学习笔记(三)模式判断与概率图流
    SQLite的SQL语法
    马云入股恒大背后暗藏四大隐情?
    ListView的优化
    通过WriteProcessMemory改写进程的内存
    “富豪相亲大会”究竟迷失了什么?
    Java实现 蓝桥杯VIP 算法提高 密码锁
  • 原文地址:https://www.cnblogs.com/webdep/p/7644523.html
Copyright © 2011-2022 走看看