[译]ASP.NET Core 2.0 视图引擎
问题
如何在ASP.NET Core 2.0中使用Razor引擎来创建视图?
答案
新建一个空项目,修改Startup.cs,添加MVC服务和请求中间件:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
添加Controllers目录,并添加HomeController控制器:
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
添加Views/Home目录,并添加Razor视图Index.cshtml:
@{
var birthDate = new DateTime(1930, 8, 26);
}
<strong>Hello MVC Razor</strong>
<p>James Bond, you were born @birthDate.ToString("yyyy-MM-dd")</p>
<p>James Bond is about @((DateTime.Now - birthDate).Days / 365) years old</p>
<p>@("<strong>Hello World</strong>")</p>
<p>@Html.Raw("<strong>james@bond.com</strong>")</p>
@{
var isHungry = true;
var gender = 0;
IEnumerable<string> friends = new[] { "Thor", "Hulk", "Iron Man" };
var technology = "asp.net mvc";
var count = technology.Count();
}
<p>
@if (isHungry)
{
<text>I'm hungry</text>
}
else
{
<text>I'm full</text>
}
</p>
@switch (gender)
{
case 0:
<p>Male</p>
break;
case 1:
<p>Female</p>
break;
default:
break;
}
@for (int i = 0; i < technology.Length; i++)
{
@technology[i].ToString().ToUpper()
}
<ul>
@foreach (var item in friends)
{
<li>@item</li>
}
</ul>
@try
{
var a = 1; var b = 0;
var result = a / b; // divide by zero
}
catch (Exception ex)
{
<p>@ex.Message</p>
}
此时的目录结构如下所示:

运行,此时页面显示:

讨论
当控制器返回ViewResult时,ASP.NET Core中间件会查找并执行Razor模板(.cshtml文件)。Razor模板使用C#和HTML的混合语法来生成最终的HTML页面。
查找视图
当ViewResult执行时,它会按照如下顺序查找视图所在路径:
1. Views/[Controller]/[Action].cshtml
2. Views/Shared/[Action].cshtml
如果模板文件名和控制器方法的名称不一致,可以在ViewResult中通过参数来指定视图模板的名称:
public IActionResult AboutMe()
{
return View("Bio");
}
Razor语法
HTML标签会原封不动的渲染到最终的HTML页面中:
<strong>Hello MVC Razor</strong>
通过@符号从HTML过渡到C#代码。C#代码块可以用如下结构包含起来:
@{
var birthDate = new DateTime(1930, 8, 26);
}
C#表达式可以直接通过@符号来输出到最终HTML页面:
<p>James Bond, you were born @birthDate.ToString("yyyy-MM-dd")</p>
或者用@( //C#表达式 )来包含起来:
<p>James Bond is about @((DateTime.Now - birthDate).Days / 365) years old</p>
Razor默认会对C#表达式进行HTML编码,观察下面的Razor代码以及生成到页面上的HTML结构:
<p>@("<strong>Hello World</strong>")</p>
<p><strong>Hello World</strong></p>

@Html.Raw可以避免C#表达式被HTML编码,如下所示:
<p>@Html.Raw("<strong>james@bond.com</strong>")</p>
<p><strong>james@bond.com</strong></p>
控制结构
Razor视图中,我们可以在C#代码块中使用各种控制结构,比如@if, @switch, @for, @foreach, @while, @do while和@try。具体示例可以查看Views/Home/Index.cshtml代码。
指令
Razor视图会被转化为继承自RazorPage的C#类(内部实现,对用户透明)。而指令可以改变这些类或者视图引擎的行为。常用的指令有:
@using
向生成的C#类添加一个using指令。类似于普通的C#类,这个指令用来导入命名空间。
@model
指定传入RazorPage的泛型类型T。当控制器返回ViewResult时,可以通过参数来指定模型类型。然后在视图页面中通过Model属性来获取模型实例。
@inject
用来向视图注入服务(首先需要在Startup中在服务容器中注册此服务)。你需要提供服务类型和名称(视图中通过此名称访问服务)。视图的依赖注入用于为视图提供强类型的数据查询服务,否则我们就需要动态的ViewData或者ViewBag属性来实现。
视图的依赖注入
下面通过一个较完整的示例来讲解@using,@model和@inject指令的用法。
首先创建一个服务:
public interface IGreeter
{
string Greet(string firstname, string surname);
} public class Greeter : IGreeter
{
public string Greet(string firstname, string surname)
{
return $"Hello {firstname} {surname}";
}
}
在Startup的服务容器中注册此服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IGreeter, Greeter>(); services.AddMvc();
}
创建一个模型:
public class AboutViewModel
{
public string Firstname { get; set; }
public string Surname { get; set; }
}
从控制器方法中返回模型实例:
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
} public IActionResult AboutMe()
{
var model = new AboutViewModel
{
Firstname = "Tahir",
Surname = "Naushad"
};
return View("Bio", model);
}
}
现在我们可以在视图中使用模型和服务了:
@using RazorEngine.Models
@model AboutViewModel
@inject IGreeter GreeterService <p>@GreeterService.Greet(Model.Firstname, Model.Surname)</p>
运行,此时页面显示:

源代码下载
原文:https://tahirnaushad.com/2017/08/23/asp-net-core-2-0-mvc-razor/
[译]ASP.NET Core 2.0 视图引擎的更多相关文章
- [译]ASP.NET Core 2.0 路由引擎之网址生成
问题 如何在ASP.NET Core 2.0中由路由引擎来生成网址? 答案 新建一个空项目,修改Startup.cs文件,添加MVC服务和中间件: public void ConfigureServi ...
- [译]ASP.NET Core 2.0 路由引擎
问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(ISe ...
- [译]ASP.NET Core 2.0 视图组件
问题 如何在ASP.NET Core 2.0中使用视图组件? 答案 新建一个空项目,修改Startup类并添加MVC服务和中间件: public void ConfigureServices(ISer ...
- [译]ASP.NET Core 2.0 系列文章目录
基础篇 [译]ASP.NET Core 2.0 中间件 [译]ASP.NET Core 2.0 带初始参数的中间件 [译]ASP.NET Core 2.0 依赖注入 [译]ASP.NET Core 2 ...
- [译]ASP.NET Core 2.0 部分视图
问题 如何在ASP.NET Core 2.0中使用部分视图来重用页面的公共部分? 答案 新建一个空项目,在Startup中添加MVC服务和中间件: public void ConfigureServi ...
- [译]ASP.NET Core 2.0 布局页面
问题 如何在ASP.NET Core 2.0项目中共享可见元素.代码块和指令? 答案 新建一个空项目,首先添加GreetingService服务和UserViewModel模型: public int ...
- [译]ASP.NET Core 2.0 区域
问题 如何将一个规模庞大的ASP.NET Core 2.0应用程序进行逻辑分组? 答案 新建一个ASP.NET Core 2.0空项目,修改Startup类,增加Mvc服务和中间件: public v ...
- [译]ASP.NET Core 2.0 中间件
问题 如何创建一个最简单的ASP.NET Core中间件? 答案 使用VS创建一个ASP.NET Core 2.0的空项目,注意Startup.cs中的Configure()方法: public vo ...
- [译]ASP.NET Core 2.0 带初始参数的中间件
问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...
随机推荐
- TileMap Editer 编辑器工具介绍
打开Tiled 新建地图... 新建地图面板包括三部分,分别是地图.地图大小和块大小.地图包括方向.土块层格式和渲染顺序,根据场景不同选择不同地图方向,土块层格式和渲染顺序默认即可:图块大小和块大小决 ...
- 快速设计ComboBox下拉框
传统软件项目开发时,需要每个控件一个一个的来设计,同时需要在页面功能中对每个控件的属性进行判定处理,尤其是页面风格布局样式需要花去一大半的时间,并且后续要想修改是非常麻烦繁琐,这样就导致设计完成一个功 ...
- 【Python学习笔记之一】Python关键字及其总结
前言 最近在学习Java Sockst的时候遇到了一些麻烦事,我觉得我很有必要重新研究学习Python这种脚本语言,参考大神的经验,淘到了一本学习Python的好书<"笨方法" ...
- java 面向对象 1
目录 一.面向过程的思想和面向对象的思想 二.简单理解面向对象 三.面向对象的设计思想 四.对象和类的概念 五.如何抽象出一个类? 六.类(对象)之间的关系 七.Java与面向对象 八.为什么使用面向 ...
- HDFS概述(2)————Block块大小设置
以下内容转自:http://blog.csdn.net/samhacker/article/details/23089157?utm_source=tuicool&utm_medium=ref ...
- Angular JS的正确打开姿势——简单实用(上)
前 言 絮叨絮叨 在分享了JS和JQuery之后,今天再给大家分享一个好玩并且特别好用JS框架--AngularJS. 一. AngularJS简介 AngularJS 诞生于2009年,由 ...
- Python数据分析(二): Numpy技巧 (4/4)
numpy.pandas.matplotlib(+seaborn)是python数据分析/机器学习的基本工具. numpy的内容特别丰富,我这里只能介绍一下比较常见的方法和属性. 第一部分: ht ...
- Mac上搭建基于Github的Hexo博客
Mac 上搭建基于Github的hexo博客 博客地址:往事亦如风的博客 hexo官方文档 本来想搭一个自己的博客,但是因为服务器真心买不起,所以就使用gitpages搭建一个免费的博客. 环境配置 ...
- WordPress-基础设置之阅读设置
对于第一次使用Wordpress系统的朋友,请先别着急发布文章及进行其他操作,为了更加科学的使用及管理wordpress,应该需要对其进行相关设置,主要涉及3个部分,一.常规设置,二.阅读设置,三.固 ...
- IDL 字符串
1.创建字符串 字符串和字符串数组通过赋值或函数方式来创建.在IDL字符串用" "或' '括起来表示. IDL> s1="abcdef" IDL> ...