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 系列文章目录

  • 相关阅读:
    Oracle 按一行里某个字段里的值分割成多行进行展示
    Property or method "openPageOffice" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by
    SpringBoot 项目启动 Failed to convert value of type 'java.lang.String' to required type 'cn.com.goldenwater.dcproj.dao.TacPageOfficePblmListDao';
    Maven 设置阿里镜像
    JS 日期格式化,留作参考
    JS 过滤数组里对象的某个属性
    原生JS实现简单富文本编辑器2
    Chrome控制台使用详解
    android权限(permission)大全
    不借助第三方网站四步实现手机网站转安卓APP
  • 原文地址:https://www.cnblogs.com/sanshi/p/7804857.html
Copyright © 2011-2022 走看看