[譯]ASP.NET Core 2.0 區域

三生石上(FineUI控制元件)發表於2017-11-09

問題

如何將一個規模龐大的ASP.NET Core 2.0應用程式進行邏輯分組?

答案

新建一個ASP.NET Core 2.0空專案,修改Startup類,增加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: "area",
			template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

		routes.MapRoute(
			name: "default",
			template: "{controller=Home}/{action=Index}/{id?}");
	});
}

建立目錄結構如下所示:

 

向Controllers和Views目錄中新增檔案(其中Area1的目錄結構如下):

 

向Area1和Area2目錄中的控制器類新增[Area]特性:

namespace Areas.Areas.Area1.Controllers
{
    [Area("Area1")]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        public IActionResult About()
        {
            return View();
        }
    }
}

執行,此時頁面顯示:

 

點選超連結Area1/Home/Index,頁面顯示:

 

返回首頁,點選超連結Area2/Home/Index,頁面顯示:

 

討論

MVC使用模型、檢視和控制器來分離應用程式的關注點。對於更大的應用程式,區域提供了一種將這三個關注點隔離到更高階別分組中的方法。例如,你可能希望將應用程式分隔成不同的模組,每個模組都包含自己的MVC結構。

為了支援路由,還有另外一個路由引數area(作為對controller和action引數的補充)。你可以將區域假想為控制器的名稱空間。在當前請求上下文中,area路由引數也可以作為環境變數存在(無需顯示提供)。下面的示例中,由於頁面存在於Area1區域中,所以連結到本區域的超連結省略了area引數(下面小節會詳細討論):

<p><strong>You are here: </strong>Area1/Home/Index</p>

<ul>
    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home/Index</a></li>
    <li><a asp-area="" asp-controller="Home" asp-action="About">Home/About</a></li>
    <li><a asp-controller="Home" asp-action="Index">Area1/Home/Index</a></li>
    <li><a asp-controller="Home" asp-action="About">Area1/Home/About</a></li>
    <li><a asp-area="Area2" asp-controller="Home" asp-action="Index">Area2/Home/Index</a></li>
    <li><a asp-area="Area2" asp-controller="Home" asp-action="About">Area2/Home/About</a></li>
</ul>

為了在專案中使用區域,你首先需要建立一個以Areas命名的目錄和每個具體的區域(包含其控制器、模型和檢視)。注意目錄結構的命名非常重要,因為MVC會按照如下順序查詢檢視所在的位置:

 

一旦目錄結構建立成功,你就可以透過[Area]特性來標識每個控制器了:

[Area("Area1")]
public class HomeController : Controller
{
}

生成連結

下面表格列出了生成超連結所需要的路由引數,其中From為超連結所在的頁面,To為超連結需要跳轉的頁面,連結格式為:{area}/{controller}/{action}。

如果省略路由引數,則意味著MVC會從當前請求上下文中檢索這些引數。為了便於維護,我個人覺得還是為每個路由引數都設定值來得方便。這篇文章所附帶的示例工程包含了不同頁面上的超連結,你可以觀察環境變數值是如何工作的:

From   To 路由引數 
 Area1/Controller1/Action1  Area1/Controller1/Action2  asp-action="Action2"
 Area1/Controller1/Action1  Area1/Controller2/Action1  asp-controller="Controller2"
 asp-action="Action1"
 Area1/Controller1/Action1  Area2/Controller1/Action1  asp-area="Area2"
 asp-controller="Controller1"
 asp-action="Action1"
Area1/Controller1/Action1 Controller1/Action1  asp-area=""
 asp-controller="Controller1"
 asp-action="Action1"

 

佈局頁面

區域內部的Razor檢視可以使用外面的佈局頁面(也就是根目錄下的/Views/Shared)。當然你可以為每個區域定義不同的佈局頁面。另外一種方法就是在外部定義公共的佈局頁面,然後區域內的佈局頁面將其作為頁面佈局,從而建立一個巢狀的佈局頁面。下面顯示了Area2區域的佈局頁面如何使用外部佈局頁面(注意為了引用外部佈局頁面,你需要指定絕對路徑):

@{ 
    Layout = "/Views/Shared/_Layout.cshtml";
}

<div>
    <nav style="background-color: lightgray">
        <h2>Area2 Layout</h2>
    </nav>
    @RenderBody()
</div>

原始碼下載

 

原文:https://tahirnaushad.com/2017/08/25/asp-net-core-2-0-mvc-areas/

 

ASP.NET Core 2.0 系列文章目錄

相關文章