尝试Razor

原文 http://www.cnblogs.com/HopeGi/archive/2013/05/22/3092074.html

在几个月以前写了一篇关于ASP.NET的MVC的博文,当时的视图没有用Razor,有园友说了Razor的好处,时隔多月之后,这回体验一下用Razor,Razor的一个特征就是@,通篇的@,不过这个@的简便性比ASPX好,写上去方便,看上去也整洁。

1.Razor基础语法

 

@***

  首先最简单的就是利用@*** 输出某个非字面值,这个就相当于ASPX<%= %>,例如输出这个系统的当前时间@DateTime.Now

在页面上的结果是

  如果是一个字段的话,也是可以用这种方式,可是对于一个字面值例如一个字符串”Hello world”,或布尔值true或整数1来说,@”Hello world”是不行的。这时就要用另一种形式。

 

@(……..)

  @(……..)这种形式能输出字面值,它能对括号里面的内容经行编码,就算里面的内容是一个字符串”<br/>”,它输出的只是一 个字符串”<br/>”,而不是html中的换行。包括上面的@***也是一样,如果一个字符串类型的字段s,它的值是”<br />”,当@s的时候,结果只是一个字符串”<br/>”,而不是换行。看看生成的html就知道了。

对于以下代码(s是已经定义了)

@("<br/>")

<br/>
<br/>

@s

页面上的结果

 

生成的html

  显然,在生成html的时候,把@(“<br/>”)和@s都以字符串的形式(“<br/>”)写到生成的html,而不是单纯的标记形式(<br/>)。这里其实和原本ASPX中的<%= %>输出的道理是一样的。

  说到这里,其实上面用“输出”这个词就不对了,不过给我的感觉就跟在控制台上输出的效果一样。

 

@{…….}

  接着就到语句块,使用语句块的是以这种形式@{},例如定义一个变量( @{string s=”Hello World”;} ),或者要循环执行一部分代码,又或者需要进行一个判断,就需要这语句块了。也就在程序语言中的流程控制。

       这里就列举了一个例子,是利用for循环输出一个三角形

@{ int c = 0;}
@for (int i = 0; i < 10; i++)
{
    for (int j = 0; j <= i; j++,c++)
    {
          <span style="color:@(c%2==0?"red":"green");margin:5px;"> @(c+" ")</span>
    }
    <br />
}

这里用了@{....}和@(....),效果如下,数字是红绿颜色交错的。

还有另一个例子,是if-else 语句的,判断当前时间,在不同时间段显示不同的问候语

@if(DateTime.Now.TimeOfDay<new TimeSpan(12,0,0))
{    @("上午好!")}
else if (DateTime.Now.TimeOfDay < new TimeSpan(18, 0, 0))
{    @("下午好!")}
else
{   @("晚上好!")}

结果如下

  这里要注意下的是,在程序语言中if或者for下面的语句块如果只有一条语句的话,花括号{} 可以省略,但是Razor不行,如果是这样

@if(DateTime.Now.TimeOfDay<new TimeSpan(12,0,0))
    @("上午好!")

的话,会报错的,不过在vs里面的提示也会看得出来。

 

@using

  上面的例子有用到一个System命名空间下的结构DateTime,如果现在想调用.net其他命名空间的类,当然可以用类的完全限定名,但是如果在反复使用的情况下,敲打类前面的命名空间这个工作量不小,Razor也可以跟cs文件里的那样使用命名空间。

例如

@using System.Threading;

@DateTime.Now
<br/>
@{Thread.Sleep(1000);}
@DateTime.Now
<br/>
@{Thread.Sleep(3000);}
@DateTime.Now

结果如下

  当然我这里是为了举例才用这个Thead的类,与cs文件里的不同,Razor的命名空间不一定全都要堆在文件的开头。

母板页

  在Razor中使用母板页,也不会有之前ASPX那样的master文件。与其他文件一样都是cshtml后缀。在 使用方面,在需要放子页内容的地方调用@RenderBody()则可,这个就代替了原本在ASPX中 的<asp:ContentPlaceHolder ID="MainContent" runat="server" />标签了。在子页方面,只需要放上这么一行代码就行了@{Layout = "~/Views/Shared/MyLayout.cshtml";},这就说明了当前子页要使用Mylayout这个模板页,当前的子页内容会插到母 版页的@RenderBody()中去。

先列举一下母板页的代码

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    <style type="text/css">
        input.btn{ background-color:Orange; color:White; font-weight:bold;}
    </style>
    <script type="text/javascript">
        $(function () {
            alert("hello world");
        });
    </script>
</head>

<body>
    <div>
    <span>
        This is a simple page
    </span>
    <ul>
        <li>
        <a href="#">Home</a>
        </li>
        <li>
         <a href="#">Register</a>
        </li>
    </ul>
    @RenderBody()
    </div>
</body>
</html>

子页的代码

@{
    Layout = "~/Views/Shared/MyLayout.cshtml";
    ViewBag.Title = "Test";
}
    id:<input type="text" />
    <br />
    password:<input type="password" />

效果图

如果在母板页中插入子页的内容不止一个,那就要用另一种形式了

母板页@RenderSection("标识符")

子页@section 标识符{

    ……内容….

}

例子如下

母板页

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    <style type="text/css">
        input.btn{ background-color:Orange; color:White; font-weight:bold;}
    </style>
    <script type="text/javascript">
        $(function () {
            alert("hello world");
        });
    </script>
</head>

<body>
    <div>
    <span>
        This is a simple page
    </span>
    <ul>
        <li>
        <a href="#">Home</a>
        </li>
        <li>
         <a href="#">Register</a>
        </li>
    </ul>
    @RenderSection("login")
    </div>
    <div>
        @RenderSection("footer")
    </div>
</body>
</html>

子页

@{
    Layout = "~/Views/Shared/MyLayout.cshtml";
    ViewBag.Title = "Test";
}
@section login{
    id:<input type="text" />
    <br />
    password:<input type="password" />
}

@section footer{
    <span>this is a footer</span>
}

结果

  在不确定子页是否有实现某部分的内容时,可以调用IsSectionDefined(“标识符”)作一个判断,如果有则引用子页的相应内容,如果没有可以做一些默认的操作

例如

    @if (IsSectionDefined("footer"))
    {@RenderSection("footer")}
    else {
        <span>defalut footer</span>
    }

 

使用行为方法传来的模型

  利用@Model可以获取到一个Action中传来的对应的模型,它是一个只读的属性。从这个属性获取的实例要从Controller进行传输,如果没有则“Model”将为null。获取了这个实例之后就可以访问实例的字段,属性调用它的方法等。

如这里简单定义了一个模型

    public class TestModel
    {
        public int Number1{get;set;}

        public int Number2 { get; set; }

        public int Sum { get { return Number1 + Number2; } }

        public int AddOuter(int num1, int num2)
        {
            return num1 + num2;
        }
    }

控制器的行为方法如下,就构造了一个模型的实例,给它两个数字赋了值,最后传到视图中去。

        public ActionResult TestPage()
        {
            TestModel model = new TestModel();
            model.Number1 = 1;
            model.Number2 = 2;
            return View(model);
        }

最后在视图上就可以通过@Model来获取该实例了。

Model.Sum= @Model.Sum
<br />
Now  Model.Number1 = 3  Model.Number2 = 2;
@{
    Model.Number1 = 3;
    Model.Number2 = 2;
 }
 <br />
Model.Sum= @Model.Sum

 <br />

Model.AddOuter(10, 20) @Model.AddOuter(10, 20)

结果如下

2.Html的表单元素的应用

接下来介绍一下一些Html的表单元素在Razor

Label

  Label有两个方法,一个是Label(“expression”),另一个是 Label(“expression”,”labelText”),Label标签有个for属性,expression参数的值就是for属性的 值,labelText是label的内容,是经过编码的,不能成为一个真正的层

例如

@Html.Label("Hello world")
<br />
@Html.Label("hello world","<div>label text</div>")
<label><div>text</div></label>

生成的html如下

 

TextBox

TextBox有以下几个重载个方法

TextBox(string name)
TextBox(string name, object value)
TextBox(string name, object value, IDictionary<string, object> htmlAttributes)
TextBox(string name, object value, object htmlAttributes)

由参数的名称都可以看出用途了

这里列举一个带样式的textbox例子

@Html.TextBox("textBox1","value",new { style = "font-size:15px; color:red;"})

生成的html如下

<input id="textBox1" name="textBox1" style="font-size:15px; color:red;" type="text" value="value"/>

  文本框肯定是一个input标签的最后一个参数是传递html属性的,那么input标签的属性有type、name、id这些,我经过尝试在最后一个参数中传递了一下属性

type="password",value="123456",name="textbox2",id="textbox3"

发现成功的有type、id,文本框变成了一个密码框了,但是value和name确改不成功。

 

DropDownList

DropDownList最简单的一个方法是DropDownList( string name),可是我使用的时候老是有这个异常

  There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key

发现最简单能用的就这样了

@Html.DropDownList("ddl1", new List<SelectListItem>(),)

不过这样生成DropDownList没有默认值,如果要有默认值则用下面这种形式

@Html.DropDownList("ddl1", new List<SelectListItem>(), "-- 请选择 --")

它就生成这样的html

<select id="ddl1" name="ddl1">
     <option value="">-- 请选择 --</option>
</select>

第二个参数是一个泛型的SelectListItem列表,这个List只要能传进来就可以了。

例如

@Html.DropDownList("ddl1",
    new List<SelectListItem>()
    {
        new SelectListItem() { Text="男", Value="man"},
        new SelectListItem(){Text="女", Value="woman"}
    },
    "-- 请选择 --")

生成的html如下

<select id="ddl1" name="ddl1">
    <option value="">-- 请选择 --</option>
    <option value="man">男</option>
    <option value="woman">女</option>
</select>

如果要增加一些html属性的,就这样子

@Html.DropDownList("ddl1",
    new List<SelectListItem>()
    {
        new SelectListItem() { Text="男", Value="man"},
        new SelectListItem(){Text="女", Value="woman"}
    },
    "-- 请选择 --", new { style = "font-size:14px; color: #00ffee;" })

 

 

 

  由于认识尚浅,故有什么说错说漏的,请各位尽管的批,在下虚心接纳,谢谢!

时间: 2024-07-30 00:46:44

尝试Razor的相关文章

Razor Templating Engine

       最近遇到html模板解析,我完全可以用MS的T4模板或者是StringTemplate等其他的模板来做,但是出于尝试和对Razor语发的感兴趣,便翻了翻Razor模板的资料,其CodePlex主页http://razorengine.codeplex.com/.       下面讲的都是一些其主页上面的例子,所以请大家别拍砖.别后面想到有些实际意义的例子在写个具体的运用例子吧. 代码 public static class Razor  {      public static s

也玩MVC3.0 Razor自定义视图引擎“.NET技术”来修改默认的Views目录结构

刚刚爱上MVC3.0,几个不眠夜的学习越来越有趣.今天随手尝试自定义Mvc3.0的视图引擎,虽然已成功,但是还发现有点小疑问.随手贴出来希望大家指教指教. MVC的视图文件目录被固定/Views目录内,区域视图文件也是被固定在/Areas目录下,出于好奇和对目录名的敏感,尝试修改它.通过reflector找到视图引擎的构造接口类VirtualPathProviderViewEngine 在MVC2.0中,自定义自己的视图引擎,继承它即可,但在3.0中,我发现继承它会缺少一个函数.再reflect

也玩MVC3.“.NET研究”0 Razor自定义视图引擎来修改默认的Views目录结构

刚刚爱上MVC3.0,几个不眠夜的学习越来越有趣.今天随手尝试自定义Mvc3.0的视图引擎,虽然已成功,但是还发现有点小疑问.随手贴出来希望大家指教指教. MVC的视图文件目录被固定/Views目录内,区域视图文件也是被固定在/Areas目录下,出于好奇和对目录名的敏感,尝试修改它.通过reflector找到视图引擎的构造接口类VirtualPathProviderViewEngine 在MVC2.0中,自定义自己的视图引擎,继承它即可,但在3.0中,上海企业网站制作我发现继承它会缺少一个函数.

一起谈.NET技术,也玩MVC3.0 Razor自定义视图引擎来修改默认的Views目录结构

刚刚爱上MVC3.0,几个不眠夜的学习越来越有趣.今天随手尝试自定义Mvc3.0的视图引擎,虽然已成功,但是还发现有点小疑问.随手贴出来希望大家指教指教. MVC的视图文件目录被固定/Views目录内,区域视图文件也是被固定在/Areas目录下,出于好奇和对目录名的敏感,尝试修改它.通过reflector找到视图引擎的构造接口类VirtualPathProviderViewEngine 在MVC2.0中,自定义自己的视图引擎,继承它即可,但在3.0中,我发现继承它会缺少一个函数.再reflect

尝试网页设计中不对称的美

  随着审美的不断提高,越来越多的设计具有一种不对称的美感.越来越多的设计师将视觉重点放置到偏离视觉中央的位置,通过不对称性来吸引用户注意,打造一种特殊的"视觉路径". 过于对称的设计,无法更自然高效的组织侧边栏.导航条等界面元素,对称设计提供的空间也往往有限.而非对称性具有一种视觉上的张力,将某种特殊的感觉转化为用户的兴趣.尽管非对称设计在布局调整上稍有难度,而且也会造成一种不平衡的感觉.然而用非对称性设计取代对称性设计,利大于弊,提供了更多的"可能".这也是网页

android4.3 截屏功能的尝试与失败分析

感谢网友cjd6568358的帮助,新版的Android系统截屏功能已经实现,需要的朋友请移步项目主页:https://github.com/Android-ScreenShot/AndroidScreenShotService(别忘点个star哦) (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景          上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/bup

opencv-想尝试做视觉识别(可怜地问几个问题)

问题描述 想尝试做视觉识别(可怜地问几个问题) 我想在笔记本上编程,用外接摄像头做视觉识别. 弱弱地问一下 1.请问普通的USB接口的外接摄像头都可以吗? 2.需不需要什么驱动程序? 3.摄像头的像素是不是对处理速度影响很大? 4.单片机底层控制和视觉识别是如何通信的? 谢谢大家了 解决方案 一般的摄像头就可以,摄像头带有驱动,或者操作系统集成驱动. 理论上像素越高,需要处理的运算量就越大,但是一般的webcam应该没问题. 这个和单片机没有什么关系.

Windows 7尝试安装更新时出现错误0x80070490

如果基于组件的服务 (CBS) 清单中包含已损坏的文件,则可能会发生此错误.若要解决此问题,您需要执行修复安装. 执行修复安装会将当前的 Windows 安装还原到安装 DVD 的版本.此操作还需要对安装 DVD 中未包含的所有更新进行安装. 注意:执行修复安装不会损坏计算机上当前已安装的文件和程序. 若要对 Windows 7 执行修复安装,请按照下列步骤操作: 1. 关闭所有程序,然后重新启动计算机. 2. 将 Windows 7 DVD 插入计算机的 DVD 驱动器中. 3. 在安装程序窗

Asp.net mvc简单实现基于Razor的分页控件

最近在写一些web应用了解了一下asp.net mvc发现的确好用,所以直接就干上了.不过在使用asp.net mvc的Razor模板的情况并不向传统webform那样可以使用控件.但从Razor的功能上已经具备相关代替的功能,只是从Razor角度来说不是 我们平常说的控件而是子模板.由于Razor可以根据自己需求把功能拆分到子模板中,然后通过RenderPage方法输出.从设计的手段上来看完全可以 把分页控件封装成一个子的cshtml,在需要的时候引用上就是了. 作为一个控件的设计其最重要的环