在ASP.NET MVC中有两套模版引擎,一套是ASPX,一套是Razor,从事过WebForms开发的朋友们,对于ASPX模版已经很熟悉了,下面我说一下我所熟悉的Razor模版引擎的一些语法,供大家参考:

在ASPX中我们使用 <% %>在里面编写C#代码

在Razor中我们将会使用@符号这个核心语法,给程序员提供了大量的便利,废话不多说,我一一举例:

1.首先如何定义变量,我们在 .cshtml 这个视图上,定义C#变量的话,我们可以先定义一个C#代码块,在这个代码块里编写C#语法

定义一个C#代码块: 

@{

  //定义一个变量

  string name="我是一个字符串"; }
//输出这个字符串

@name

2.假如我们现在有一个需求,让我们输出10个<span>我爱北京天安门</span>,那么肯定要使用for循环了

@for(var i=0;i<10;i++){

<span>我爱北京天安门</span>

}

有同学可以有疑问了,为什么我们在C#代码段里面可以直接写html标签,ASPX里我们必须将C#代码放在<%%>中,因为Razor引擎有一个非常强大的功能,那就是自动识别<>(尖括号),当在Razor中遇到<>的时候,Razor会自动识别这里是Html语法,看到@符号就知道开始编写C#代码了。

那么我们就有疑问了,Razor视图是如何识别的呢?

在ASPX中,我们的 .aspx页面和 .aspx.cs页面的,他们编译以后会编译成两个类,并且 .aspx 继承于.aspx.cs

在.cshtml在编译后也会编译成一个类,那么我们如何能看到这个类呢?那就要借助我们的神器 .NET Reflector 反编译。

//我们随便找一个 .cshtml 输出这一段话,表示输出视图程序集所在的路径
@this.GetType().Assembly.Location

会在页面上输出 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\vs\fc705515\4aff2ded\App_Web_ju12f1hu.dll  类似的路径,那么我们可以去找到此dll文件,将其拖入 .NET Reflector中。

我们就可以看到了这个.cshtml页面编译成的类_Page_Views_Employee_Index_cshtml,这个类继承WebViewPage<object>。这个类有一个重写父类的Execute方法,从方法中我们很容易看出一些html标签:例如<!DOCTYPE html> 等等,这个方法将里面的html标签内容拼接,C#代码在此方法定义并执行,再将输出的内容拼接起来。

3.Razor视图引擎在解析C#语法块里的标签时,会去自动查找结束标签,如果没有结束标签,则Razor视图引擎会报错,除非是单标签,例如: <img />  自定义的<beijing/>

4.Razor视图引擎,在编译页面类时,如果遇到了@符号就会认为是C#语法,如果此C#语句块中包含了<>那么就会自动当字符串处理

5.现在我有一个需求就是我想循环输出10条,没有任何标签修饰的 我爱北京天安门,那么这个怎么做?

 //第一种方式
@{
var str = string.Empty;
for (var i = 0; i < 10;i++){
str += "我爱北京天安门";
}
}
@str //第二种方式
@for (var k = 0; k < 10; k++) {
<text>我爱北京天安门</text>
}

第一种方式给人感觉比较繁琐,因为Razor视图引擎能识别<>,如果你直接在@{}代码里书写

我爱北京天安门 会报错的,因为这不是C#语法,如果你用<span></span>修饰的话,可以实现,但是我们查看网页源代码的时候,可以看到这个就不是我们想要的结果了。所以我们引入了第二种方式,<text></text>标签,这个是Razor自带的标签,在这个标签里书写文字可以原样输出到浏览器。

6.前面我们提到过,Razor可以识别<>,如果我们想要在html中输出C#数据的话怎么办

//控制器
public ActionResult check()
{
Person p = new Person() { Name="aa" };
return View(p);
}
//视图
@for(var i=0;i<10;i++){
//我们在控制器传递数据到视图上,如果下面这种情况输出的话 <b>asdsad@Model.Name~~~~~</b> } //输出结果:asdsad@Model.Name asdsad@Model.Name asdsad@Model.Name asdsad@Model.Name asdsad@Model.Name asdsad@Model.Name asdsad@Model.Name asdsad@Model.Name asdsad@Model.Name asdsad@Model.Name
显然这不是我们想要的结果 那么我们如果更正呢?
我们需要在@符号前加一个空格,这样Razor就是识别了

<b>asdsad @Model.Name~~~~~</b>

//由此我们可以得到结论:

如果想在html中输出C#语句的话,@符号钱必须要加空格,否则将@符号当成字符串处理

//控制器
public ActionResult check()
{
Person p = new Person() { Name="aa" };
ViewBag.CName = "cc";
return View(p);
}
//视图
我要输出一个 cc.CName呢?
//这样输出,编译器会报错,编译器会解析为cc有一个CName属性,但是显然cc中没有这个属性
@ViewBag.CName.CName
//那么我们可以通过
@(ViewBag.CName).CName

7.我现在用C#定义一个html标签,然后输出到浏览器上

//第一种方式

@{
string str="<input type='text' value=''>":
}
@str
//输出结果
<input type='text' value=''>
//这样输出的话,我们查看网页源代码会发现,我们书写的html的input标签的<>会被转义。显然不是我们想要的结果,如果我们想输出一个完全的input 标签呢 //第一种方式
使用@Html.Raw(str),输出不转义的html //第二种方式
使用HtmlString输出不转义的html
@{
HtmlString htmlRaw=new HtmlString("<input type='button' value='按钮'>");
}
@htmlRaw
//第三种方式
@{
MvcHtmlString mvcStr=new MvcHtmlString("<p>我不会被转义</p>");
}
@mvcStr
//第四种方式
//使用MvcHtmlString 静态方法 Create输出不转义的html
@{
var _str=MvcHtmlString.Create("<p>我是方式二</p>");
}
@_str

今天先介绍这些,我先此说不一定完全正确,欢迎批评指正。

ASP.NET Mvc Razor视图语法的更多相关文章

  1. Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html

    Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html 1.前言 上一篇文章我开源了轮子,Asp.net Core 3.1 Razor视图模版动态渲染PDF,然后,很 ...

  2. ASP.NET MVC Razor视图引擎攻略

    --引子 看下面一段MVC 2.0的代码. <%if (Model != null){%> <p><%=Model%></p><%}%>&l ...

  3. ASP.NET MVC——Razor视图引擎

    Razor是MVC框架视图引擎,我们今天就来说一说Razor视图引擎. 首先还是来创建一个基础项目叫Razor来演示. 先来定义一个Model叫Product public class Product ...

  4. ASP.NET MVC Razor视图(2)

    昨天介绍了一些Razor的基本语法,几天接着向下说: 补成一个,上次介绍了怎么输出原样的文本,用<text></text>标签,下面再介绍一种语法: @{@:我爱北京}  这个 ...

  5. MvcMailer通过ASP.NET MVC Razor视图和基架发送邮件

    MvcMailer是一个有趣的组件,您可以使用ASP.NET MVC框架在发送邮件.很重要的是,它使用Razor视图引擎的观点作为电子邮件模板和很容易安装和使用.在本文中你将看到如何安装,设置邮件模板 ...

  6. Asp.Net MVC Razor视图引擎与My97DatePicker插件的结合

    using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System. ...

  7. ASP.NET MVC Razor语法

    ASP.NET MVC Razor语法 (一) 关于_ViewStart.cshtml文件     使用Razor模板引擎的话,会自动生成一个_ViewStart.cshtml文件.事实上,_View ...

  8. 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图

    这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...

  9. asp.net mvc 部分视图加载区别

    ASP.NET MVC 部分视图   ASP.NET(11)  版权声明:本文为博主原创文章,未经博主允许不得转载. [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 ...

随机推荐

  1. 自定义控件(视图)1期笔记02:View的绘制流程

    1. 引言: 来自源码的3个方法: (1)public final void measure():测量,用来控制控件的大小,final不建议覆写 (2)public void layout():布局, ...

  2. AT-FragmentPagerAdapter

    关于FragmentPagerAdapter的粗略翻译 英文版api地址:FragmentPagerAdapter(自备梯子) FragmentPagerAdapter    类概述(Class Ov ...

  3. Android更改imagebutton为纯色方法

    我的imagebutton所用的背景png图片是灰色的,但是我想让他显示出来是白色的按钮,如果用ps去一个个填充不太现实,那有没有什么办法去通过xml里的属性改变背景颜色呢? 一开始我用了网上的方法 ...

  4. Android安全相关书籍汇总

    Android安全相关书籍汇总http://blog.csdn.net/testing_is_believing/article/details/22936695

  5. 【排障】Outlook Express 2G收件箱大小限制

    Outlook Express 2G收件箱大小限制 文:铁乐猫 ----------------------------- Outlook Express(以下简称OE)客户端收件箱大于或接近2G时, ...

  6. MyBatis5:MyBatis集成Spring事务管理(上篇)

    前言 有些日子没写博客了,主要原因一个是工作,另一个就是健身,因为我们不仅需要努力工作,也需要有健康的身体嘛. 那有看LZ博客的网友朋友们放心,LZ博客还是会继续保持更新,只是最近两三个月LZ写博客相 ...

  7. how to learn algorithms(ZAC)

    (这一篇觉得写得很棒,故拷过来以便慢慢看,细细体会,详情请访问http://blog.csdn.net/shenmen123456/article/details/6575647) 第一阶段:练经典常 ...

  8. Ajax学习笔记(1)

    Ajax全称为Asynchronous Javascript and XML.一般用于页面数据交互响应,最大的好处是响应时无需刷新页面. Ajax的优点: 1.不需要插件的支持.用户只需允许javas ...

  9. [转]Markdown 11种基本语法

    Markdown 11种基本语法 现在是我在学习Markdown时做的笔记.学完这些Markdown的基本使用已经不成问题. 1. 标题设置(让字体变大,和word的标题意思一样) 在Markdown ...

  10. jquery animate 制作简单弹幕

    定位滚动条 $("html,body").animate({scrollTop:$(".middle1").offset().top},1000) 弹幕 < ...