在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. php中global和$GLOBALS[]的分析之一

    PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖       这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数 ...

  2. [COCOS2DX]第一个开源项目的部署和运行<win32版本>

    1.无法加载项目: 1.1 按照之前的方法创建一个名为FirstDemo的项目,并将下载到的源代码包全部拷贝到FirstDemo中 1.2 点击demo.sln启动项目: 修改属性: 2.无法打开“g ...

  3. Java基础知识强化之IO流笔记65:序列化流 和 反序列化流

    1. 什么是 序列化 和 反序列化 ?     序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程.比如转化为二进制.xml.json等的过程. 在序列化期间,对 ...

  4. React Editor 应用编辑器(1) - 拖拽功能剖析

    这是可视化编辑器 Gaea-Editor 的第一篇连载分析文章,希望我能在有限的篇幅讲清楚制作这个网页编辑器的动机,以及可能带来的美好使用前景(画大饼).它会具有如下几个特征: 运行在网页 文档流布局 ...

  5. 全新的手势,侧滑返回、全局右滑返回都OUT啦!

    前言 Android快速开发框架-ZBLibrary 最近将以前的 全局右滑返回 手势功能改成了 底部左右滑动手势. 为什么呢?为了解决滑动返回手势的问题. 目前有3种滑动返回手势 一.侧滑返回 代表 ...

  6. 【安卓小技巧】WebView设置在本页面打开网页,而不是启动浏览器打开

    使用WebView可以巧妙的在安卓APP中嵌入HTML页面, WebView wb = (WebView) findViewById(R.id.web); //找到WebView控件 wb.setWe ...

  7. Hibernate - 使用注解完成映射

    除了使用XML配置来映射对象和数据库表,还可以使用注解来完成持久化.使用注解需要导入Hibernate Annotations扩展包 @Entity -加在类的前面,将类声明为持久化类. -javax ...

  8. mkfs.xfs命令没找到

    yum install xfsprogs xfsdump

  9. linux基于file的logger

    我们可能会遇到这样的问题:即写出的代码可能需要编译成动态连接库并在不同运行环境下运行,而这些运行环境下log的输出方式可能不同,一种运行环境的log方式在另一种运行环境下可能无法输出.而为保证多种运行 ...

  10. layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案

    layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案 >>>>>>>>>>>>> ...