ASP.NET MVC - Razor

在本章中,我们将介绍ASP.NET MVC应用程序中的Razor视图引擎以及Razor存在的一些原因. Razor是一种标记语法,允许您使用C#和VB.Net将基于服务器的代码嵌入到网页中.它不是一种编程语言.它是服务器端标记语言.

Razor与ASP.NET MVC没有关系,因为Razor是一个通用的模板引擎.您可以在任何地方使用它来生成HTML之类的输出.只是ASP.NET MVC实现了一个视图引擎,允许我们在MVC应用程序中使用Razor来生成HTML.

View Engine

您将拥有一个模板文件,其中包含一些文字文本和一些代码块.您将该模板与某些数据或特定模型相结合,其中模板指定数据应该出现的位置,然后执行模板以生成输出.

Razor Vs ASPX

  • Razor与ASPX文件的工作方式非常相似. ASPX文件是模板,其中包含文字文本和一些C#代码,用于指定数据的显示位置.我们执行这些操作来为我们的应用程序生成HTML.

  • ASPX文件依赖于ASP.NET运行时可用于解析和执行这些ASPX文件. Razor没有这样的依赖.

  • 与ASPX文件不同,Razor有一些不同的设计目标.

目标

Microsoft希望Razor易于使用且易于学习,并且在Visual Studio等工具内部工作,以便IntelliSense可用,调试器是可用,但他们希望Razor与ASP.NET或ASP.NET MVC等特定技术无关.

如果您熟悉ASPX文件的生命周期,那么你可能已经意识到,ASP.NET运行时依赖于解析和执行这些ASPX文件.微软希望Razor变得聪明,让开发人员的工作更轻松.

让我们看一下ASPX文件中的示例代码,其中包含一些文字文本.这是我们的HTML标记.它还包含一些C#代码.

<% foreach (var item in Model) { %>
   <tr>
      <td>
         <%: Html.ActionLink("Edit", "Edit", new { id = item.ID })%> |
         <%: Html.ActionLink("Details", "Details", new { id = item.ID }) %>|
         <%: Html.ActionLink("Delete", "Delete", new { id = item.ID })%>
      </td>
		
      <td>
         <%: item.Name %>
      </td>
		
      <td>
         <%: String.Format("{0,g}", item.JoiningDate) %>
      </td>
		
   </tr>
<%}%>

但是这些Web表单基本上被微软重新用于与早期版本的MVC一起使用,这意味着ASPX文件从来都不是MVC的完美匹配.

当您需要从C#代码转换回HTML并从HTML代码转换回C#代码时,语法有点笨拙. IntelliSense还会提示您执行在MVC项目中没有意义的事情,例如将输出缓存和用户控件的指令添加到ASPX视图中.

现在看看这个生成相同输出的代码,区别在于它使用Razor语法.

@foreach (var item in Model) {
   <tr>
      <td>
         @Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
         @Html.ActionLink("Details", "Details", new { id = item.ID }) |
         @Html.ActionLink("Delete", "Delete", new { id = item.ID })
      </td>
		
      <td>
         @item.Name
      </td>
		
      <td>
         @String.Format("{0,g}", item.JoiningDate)
      </td>
   </tr>
}

使用Razor语法,您可以使用"@"符号开始一些C#代码,Razor解析将自动切换到解析这个语句,这个foreach语句,作为一些C#代码.

但是当我们完成foreach语句并且我们有大括号时,我们可以从C#代码转换为HTML没有放置明确的标记,比如尖括号中的百分比.

Razor解析器非常智能,可以在C#代码和HTML之间切换,再次从HTML转换回C#代码,当我们需要在这里放置我们的大括号.如果你比较这两个代码块,我想你会同意Razor版本更易于阅读和更容易编写.

使用Razor创建视图

让我们创建一个新的ASP.Net MVC项目.

Razor MVC Project

在名称字段中输入项目名称,然后单击"确定".

project_name

为简单起见,选择Empty选项并选中'Add folders and core references for'部分中的MVC复选框,然后单击Ok.它将创建一个具有最小预定义内容的基本MVC项目.

一旦项目由Visual Studio创建,您将在Solution Explorer窗口中看到许多文件和文件夹.由于我们从空项目模板创建了ASP.Net MVC项目,所以目前应用程序不包含任何要运行的内容.由于我们从一个空应用程序开始,甚至没有一个控制器,让我们添加一个HomeController.

要添加控制器,请右键单击解决方案资源管理器中的控制器文件夹,然后选择添加 → 控制器.它将显示Add Scaffold对话框.

Razor Controller Folder

选择 MVC 5控制器 - 清空选项并单击添加按钮,然后将出现添加控制器对话框.

HomeController

将名称设置为HomeController并单击"添加"按钮.您将在Controllers文件夹中看到一个新的C#文件'HomeController.cs',该文件也可以在Visual Studio中进行编辑.

在Visual Studio中编辑

右键单击Index操作并选择Add View ...

索引操作添加视图

从"模板"下拉列表中选择"空",然后单击"添加"按钮. Visual Studio将在 View/Home 文件夹中创建一个Index.cshtml文件.

Create Index.cshtml

请注意,Razor视图具有cshtml扩展名.如果您使用Visual Basic构建MVC应用程序,它将是VBHTML扩展.在这个文件的顶部是一个代码块,它明确地将此Layout属性设置为null.

当您运行此应用程序时,您将看到空白网页,因为我们已经创建了一个View空模板.

空白网页

让我们添加一些C#代码让事情变得更有趣.要在Razor视图中编写一些C#代码,我们要做的第一件事就是输入'@'符号,告诉解析器它将在代码中执行某些操作.

让我们创建一个FOR循环在花括号内指定'@i',这实际上是告诉Razor放置i的值.

@{
   Layout = null;
} 

<!DOCTYPE html>
<html>
   <head>
      <meta name = "viewport" content = "width = device-width" />
      <title>Index</title>
   </head>
	
   <body>
      <div>
         @for (int index = 0; index < 12; index++){
            <div>@index </div>
         }
      </div>
   </body>
	
</html>

运行此应用程序,您将看到以下输出.

Razor Output