ASP.NET Mvc Razor视图语法
在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视图语法的更多相关文章
- Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html
Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html 1.前言 上一篇文章我开源了轮子,Asp.net Core 3.1 Razor视图模版动态渲染PDF,然后,很 ...
- ASP.NET MVC Razor视图引擎攻略
--引子 看下面一段MVC 2.0的代码. <%if (Model != null){%> <p><%=Model%></p><%}%>&l ...
- ASP.NET MVC——Razor视图引擎
Razor是MVC框架视图引擎,我们今天就来说一说Razor视图引擎. 首先还是来创建一个基础项目叫Razor来演示. 先来定义一个Model叫Product public class Product ...
- ASP.NET MVC Razor视图(2)
昨天介绍了一些Razor的基本语法,几天接着向下说: 补成一个,上次介绍了怎么输出原样的文本,用<text></text>标签,下面再介绍一种语法: @{@:我爱北京} 这个 ...
- MvcMailer通过ASP.NET MVC Razor视图和基架发送邮件
MvcMailer是一个有趣的组件,您可以使用ASP.NET MVC框架在发送邮件.很重要的是,它使用Razor视图引擎的观点作为电子邮件模板和很容易安装和使用.在本文中你将看到如何安装,设置邮件模板 ...
- Asp.Net MVC Razor视图引擎与My97DatePicker插件的结合
using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System. ...
- ASP.NET MVC Razor语法
ASP.NET MVC Razor语法 (一) 关于_ViewStart.cshtml文件 使用Razor模板引擎的话,会自动生成一个_ViewStart.cshtml文件.事实上,_View ...
- 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图
这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...
- asp.net mvc 部分视图加载区别
ASP.NET MVC 部分视图 ASP.NET(11) 版权声明:本文为博主原创文章,未经博主允许不得转载. [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 ...
随机推荐
- php中global和$GLOBALS[]的分析之一
PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖 这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数 ...
- [COCOS2DX]第一个开源项目的部署和运行<win32版本>
1.无法加载项目: 1.1 按照之前的方法创建一个名为FirstDemo的项目,并将下载到的源代码包全部拷贝到FirstDemo中 1.2 点击demo.sln启动项目: 修改属性: 2.无法打开“g ...
- Java基础知识强化之IO流笔记65:序列化流 和 反序列化流
1. 什么是 序列化 和 反序列化 ? 序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程.比如转化为二进制.xml.json等的过程. 在序列化期间,对 ...
- React Editor 应用编辑器(1) - 拖拽功能剖析
这是可视化编辑器 Gaea-Editor 的第一篇连载分析文章,希望我能在有限的篇幅讲清楚制作这个网页编辑器的动机,以及可能带来的美好使用前景(画大饼).它会具有如下几个特征: 运行在网页 文档流布局 ...
- 全新的手势,侧滑返回、全局右滑返回都OUT啦!
前言 Android快速开发框架-ZBLibrary 最近将以前的 全局右滑返回 手势功能改成了 底部左右滑动手势. 为什么呢?为了解决滑动返回手势的问题. 目前有3种滑动返回手势 一.侧滑返回 代表 ...
- 【安卓小技巧】WebView设置在本页面打开网页,而不是启动浏览器打开
使用WebView可以巧妙的在安卓APP中嵌入HTML页面, WebView wb = (WebView) findViewById(R.id.web); //找到WebView控件 wb.setWe ...
- Hibernate - 使用注解完成映射
除了使用XML配置来映射对象和数据库表,还可以使用注解来完成持久化.使用注解需要导入Hibernate Annotations扩展包 @Entity -加在类的前面,将类声明为持久化类. -javax ...
- mkfs.xfs命令没找到
yum install xfsprogs xfsdump
- linux基于file的logger
我们可能会遇到这样的问题:即写出的代码可能需要编译成动态连接库并在不同运行环境下运行,而这些运行环境下log的输出方式可能不同,一种运行环境的log方式在另一种运行环境下可能无法输出.而为保证多种运行 ...
- layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案
layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案 >>>>>>>>>>>>> ...