在本章中,我們來看看ASP.NET MVC應(yīng)用程序中的Razor視圖引擎以及為什么使用Razor的一些原因。 Razor是一種標(biāo)記語法,可以讓您使用 C# 和VB.Net將基于服務(wù)器的代碼嵌入到網(wǎng)頁中。 這不是一種編程語言。 這是一個服務(wù)器端標(biāo)記語言。
Razor與ASP.NET MVC沒有任何關(guān)系,因為Razor是一個通用的模板引擎。 您可以在任何地方使用它來生成像HTML一樣的輸出。 只是ASP.NET MVC實現(xiàn)了一個視圖引擎,它允許在MVC應(yīng)用程序內(nèi)部使用Razor來生成HTML。
假設(shè)有一個模板文件,它是一些文字和一些代碼塊的混合體??梢詫⒃撃0迮c一些數(shù)據(jù)或模板指定數(shù)據(jù)應(yīng)該出現(xiàn)的位置的特定模型相結(jié)合,然后執(zhí)行模板以生成輸出。
微軟希望Razor易于使用,易于學(xué)習(xí),并且可以在Visual Studio等工具中使用,因此IntelliSense 和調(diào)試器可用,但他們希望Razor與特定技術(shù)(如ASP.NET或 ASP.NET MVC)綁定關(guān)聯(lián)。
如果熟悉ASPX文件的生命周期,那么可能會意識到,ASP.NET運行時可以解析和執(zhí)行這些ASPX文件。 微軟希望Razor聰明,讓開發(fā)人員的工作更輕松。
下面來看一個ASPX文件中的示例代碼,它包含一些文本文本。這是HTML標(biāo)記,包含一點 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的完美搭配。
當(dāng)您需要從 C# 代碼轉(zhuǎn)換回HTML代碼,或者從HTML代碼轉(zhuǎn)換回 C# 代碼時,語法有點笨拙。 IntelliSense也會提示您執(zhí)行一些在MVC項目中沒有意義的事情,例如將輸出緩存和用戶控件的指令添加到ASPX視圖中。
現(xiàn)在看看這個產(chǎn)生相同輸出的代碼,不同之處在于它使用的是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# 代碼。
但是,當(dāng)我們完成了foreach語句,并且使用大括號的時候,可以從 C# 代碼轉(zhuǎn)換成HTML,而不用在里面放置一個明確的標(biāo)記,就像尖括號中的百分比。
Razor解析器足夠聰明,可以在 C# 代碼和HTML之間進行切換,而當(dāng)將大括號放在這里時,再次從HTML切換回 C# 代碼。如果比較這兩個代碼塊,您會發(fā)現(xiàn)Razor版本更易于閱讀和編寫。
下面我們來創(chuàng)建一個新的ASP.Net MVC項目。
在名稱字段中輸入項目的名稱:MVCRazor,然后單擊確定。如下圖所示 -
為了簡單起見,選擇 空 選項并在為以下項添加文件夾和核心引用 部分選中MVC復(fù)選框,然后單擊確定。 它將使用最少的預(yù)定義內(nèi)容創(chuàng)建一個基本的MVC項目。

項目創(chuàng)建后,將在“解決方案資源管理器”窗口中看到許多文件和文件夾。 因為我們已經(jīng)從一個空的項目模板創(chuàng)建了ASP.Net MVC項目,所以目前應(yīng)用程序不包含任何要運行的東西。 由于從一個空應(yīng)用程序開始,甚至沒有一個控制器,所以需要手動添加一個控制器:HomeController 。
要添加控制器,請右鍵單擊解決方案資源管理器 中的Controllers 文件夾,然后選擇:添加 -> 控制器 ,它將顯示“添加基架” 對話框。
選擇MVC 5控制器 - 空 選項,然后單擊添加 按鈕,然后添加控制器對話框?qū)⒊霈F(xiàn)。
將名稱設(shè)置為:HomeController,然后單擊“添加”按鈕。在Controllers 文件夾中看到一個新的 C# 文件:HomeController.cs,在Visual Studio中打開并進行編輯。代碼如下所示 -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVCRazor.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
}
}
右鍵單擊Index操作方法,然后選擇添加視圖… ,如下所示 -
從模板下拉列表中選擇Empty,然后點擊添加 按鈕。 Visual Studio將在View/Home文件夾中創(chuàng)建一個Index.cshtml文件。內(nèi)容如下所示 -
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
</div>
</body>
</html>
請注意,Razor視圖有一個cshtml擴展名。 如果使用Visual Basic構(gòu)建MVC應(yīng)用程序,它將是一個VBHTML擴展。在這個文件的頂部是一個代碼塊,它將這個Layout屬性顯式地設(shè)置為null。
當(dāng)運行這個應(yīng)用程序,會看到空白的網(wǎng)頁,因為我們已經(jīng)創(chuàng)建了一個空模板的視圖。
下面添加一些 C# 代碼。要在Razor視圖中編寫一些 C# 代碼,要做的第一件事就是輸入"@"符號,告訴解析器它將在代碼中執(zhí)行某些操作。
創(chuàng)建一個FOR循環(huán),在大括號內(nèi)指定@index,這實質(zhì)上是告訴 Razor 存儲變量index的值。
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width = device-width" />
<title>第一個Razor示例</title>
</head>
<body>
<div>
@for (int index = 0; index < 12; index++)
{
<div>@index </div>
}
</div>
</body>
</html>
運行這個應(yīng)用程序,會看到下面的輸出。