zoukankan      html  css  js  c++  java
  • MVC4 中使用 Area 和 注意的地方

     

    在MVC项目中经常会使用到Area来分开不同的模块让项目结构更加的清晰。

    步骤如下:

     项目 –> 添加 -> 区域 (Area)

     输入 Admin

    添加成功后

    Area包含:
    创建一个空MVC工程结构类似,Admin Area 有自己的 Controllers、Models 和 Views 文件夹,不一样的地方就是多了一个 AdminAreaRegistration.cs 文件,这个文件中定义了一个叫 AdminAreaRegistration 的类,它的内容如下:

    根目录可以放一套一样的结构用来做前端开发使用,而admin 目录一般会作为管理员后台来开发!

    AdminAreaRegistration.cs 文件,这个文件中定义了一个叫 AdminAreaRegistration 的类,它的内容如下:

    namespace MvcApp4.Areas.Admin
      {
          public class AdminAreaRegistration : AreaRegistration
         {
             public override string AreaName
              {
                  get
                  {
                      return "Admin";
                 }
             }
     
             public override void RegisterArea(AreaRegistrationContext context)
             {
                 context.MapRoute(
                     "Admin_default",
                     "Admin/{controller}/{action}/{id}",
                     new { controller = "home", action = "Index", id = UrlParameter.Optional },
                     namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" } //指定该路由查找控制器类的命名空间
                 );
             }
         }
     }

    在这里需要注意需加入 Areas 所在的命名空间,来控制 controllers 接收的参数,不然访问会出现错误,往下一点会提到。

    namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" }

    AreaRegistrationContext 类的 MapRoute 方法和 App_Start-> RouteConfig.cs  的 MapRoute 方法的使用是一样的,只是区分Area 目录下的路由控制!

    在 Global.asax 中的 Application_Start 方法会自动加了这样一句代码

     protected void Application_Start() {
         AreaRegistration.RegisterAllAreas();
     
         WebApiConfig.Register(GlobalConfiguration.Configuration);
         FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
         RouteConfig.RegisterRoutes(RouteTable.Routes);
         BundleConfig.RegisterBundles(BundleTable.Bundles);
     }

    调用 AreaRegistration.RegisterAllAreas 方法让MVC应用程序在启动后会寻找所有继承自 AreaRegistration 的类,并为每个这样的类调用它们的 RegisterArea 方法。

    下面我们来做一个 Demo

     新建两个访问连接,内容都是一样,都是简单输出一个 "hello World"

    URL定位到 (areas/admin)

    http://localhost:18291/Admin/Home/Index

    URL定位到(根目录)

    http://localhost:18291/Home/Index  

    public class HomeController : Controller
          {
              //
              // GET: /Admin/Home/
      
              public ActionResult Index()
              {
                  return Content("hello world");
              }
     
         }

    如果刚才没有加入:

    namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" }

    运行后就会出现如下错误:

    但是如果我们把根目录下的  /Home/Index  的内容输出改成  “Root Say hello World” , 你会发现还是输出 “hello World”,

    这是就是  Controller的歧义问题

    这就是我们需要注意的另一个地方

    我们需要在App_start下的 RouteConfig.cs 也要增加一个 namespaces 来声明 Controller 访问的命名空间!

    //App_start下的 RouteConfig.cs   
      public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    namespaces: new[] { "MvcApp4.Controllers" }//指定该路由查找控制器类的命名空间 controllers
                );
            }
        }
    
       //areas 下的 AdminAdminAreaRegistration.cs 
        public class AdminAreaRegistration : AreaRegistration
        {
            public override string AreaName
            {
                get
                {
                    return "Admin";
                }
            }
    
            public override void RegisterArea(AreaRegistrationContext context)
            {
                context.MapRoute(
                    "Admin_default",
                    "Admin/{controller}/{action}/{id}",
                    new { controller = "home", action = "Index", id = UrlParameter.Optional },
                    namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" } //对应的命名空间的 controllers
                );
            }
        }

    这样访问时就可以区分 , 不同目录的 controller  

  • 相关阅读:
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 390 消除游戏
    Java实现 LeetCode 390 消除游戏
  • 原文地址:https://www.cnblogs.com/ldyblogs/p/controller.html
Copyright © 2011-2022 走看看