zoukankan      html  css  js  c++  java
  • MVC 添加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

  • 相关阅读:
    负margin实现div的左右排版
    一起来灭掉IE6!
    javac编译多个带package文件
    iis express感觉还不错
    关于sqlite使用entity framework的布署问题
    远程服务器返回了错误 NOTFOUND
    userAgent string detection in javascript
    a crossbroswer solution for parse xml fragment
    event related object in javascript
    several way to implement inheritance in javascript
  • 原文地址:https://www.cnblogs.com/LoveQin/p/5991152.html
Copyright © 2011-2022 走看看