zoukankan      html  css  js  c++  java
  • [译]ASP.NET Core 2.0 区域

    问题

    如何将一个规模庞大的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 系列文章目录

  • 相关阅读:
    渗透利器-kali工具 (第四章-4) 学习python强大的第三方库
    渗透利器-kali工具 (第四章-3) Python数据结构学习
    渗透利器-kali工具 (第四章-2) python循环判断分支语句与异常处理
    渗透利器-kali工具 (第四章-1) Python环境安装与基本语法
    渗透利器-kali工具 (第三章-7) webshell管理工具
    渗透利器-kali工具 (第三章-6) Xss漏洞学习之-Beef-Xss
    php面试笔记(6)-php基础知识-正则表达式考点
    php利用七牛云的对象存储完成图片上传-高效管理图片
    将Markdown编辑器搬进您的博客-让我们更优雅的书写文章
    踩坑ThinkPHP5之模型对象返回的数据集如何转为数组
  • 原文地址:https://www.cnblogs.com/sanshi/p/7804857.html
Copyright © 2011-2022 走看看