在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 下的 \Admin\AdminAreaRegistration.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

MVC 添加Area的更多相关文章

  1. MVC添加Area出现“到多个与名为“Home”的控制器匹配的类型的解决方法”

    新建MVC项目,添加HomeController,然后添加名字为Admin的Area后,新建HomeController.这个时候,运行项目会出现以下错误: 解决办法如下: 打开网址下面的HomeCo ...

  2. ASP.NET MVC中Area的另一种用法

    ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...

  3. MVC 插件化框架支持原生MVC的Area和路由特性

    .NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribut ...

  4. MVC中Area的使用

    1.Area是什么? MVC 2 中引进了区域的概念,它允许将模型,视图和控制器分成单独的功能节点,换句话说,可以在大型复杂的网站中建立几个区域(模块),每一个区域都有Model,View,Contr ...

  5. ASP.NET MVC 创建 Area 以及使用

    此博客全乘抄袭,只为以后自己能再次用到 参考链接 http://www.cnblogs.com/willick/p/3331519.html ASP.NET MVC允许使用 Area(区域)来组织We ...

  6. ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块

    之前的My Blog提供了列表的展示和文章显示功能,但是所有数据仍然只能通过数据库录入,为了完成最初的角色“作者”的用例,本章将介绍如何使用“Area”实现My Blog的管理功能. 根据功能分离代码 ...

  7. MVC中Area的另一种用法

    [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{action}", new { }, n ...

  8. Asp.net MVC 基于Area的路由映射

    对于一个较大规模的Web应用,我们可以从功能上通过Area将其划分为较小的单元.每个Area相当于一个独立的子系统,具有一套包含Models.Views和Controller在内的目录结构和配置文件. ...

  9. mvc添加多条数据到数据库

    from : http://www.th7.cn/Program/net/201502/387849.shtml mvc的视图太强大了,个人刚刚接触.(初级菜鸟,懂的不多,往大神们指点)需求是,客户点 ...

随机推荐

  1. 从linux0.11中起动部分代码看汇编调用c语言函数

    上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...

  2. 安装Windows10,Ubuntu双系统14.04LTS记录

    参考链接:http://www.jianshu.com/p/2eebd6ad284d(推荐直接看这个链接,我也是看这篇博客装的)然后自己记录一下,防止以后找不到了 本记录是在Windows10 上安装 ...

  3. django的cookie和session以及内置信号、缓存

    cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...

  4. 浅谈:javascript的面向对象编程之具体实现

    下面的javascript代码都是需要使用jQuery插件来做的.希望大家可以搭建好工作环境 首先我们来做一个练习:在一个删除的超链接中添加一个提示信息,提示是否确认删除. 一般情况下我们都会这么做 ...

  5. Android SDK NDK开发总结

    描述:http://talent.baidu.com/external/baidu/index.html#/jobDetail/2/1237247043 android studio实现Jni(C/C ...

  6. win10下的使用

    一.win10下使用win7那样的图片查看器快些. 打开图片的设置,关闭自动增强我的图片 二.查看win10秘钥 1.打开注册表,依次定位:HKEY_LOCAL_MACHINE/SOFTWARE/Mi ...

  7. Web Service和WCF的区别。其实二者不属于一个范畴!!!

    Web Service和WCF的区别 [1]Web Service:严格来说是行业标准,也就是Web Service 规范. 它有一套完成的规范体系标准,而且在持续不断的更新完善中. 它使用XML扩展 ...

  8. es6学习笔记(1) let和const命令详解

    let和const命令: Es6新增了let命令,声明变量,但与var不一样的,只在let命令所在的代码块内有效(如for循环之外let声明的变量就不再有效).并且let不像var那样会发生" ...

  9. c#面试题汇总

    下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化,不要梦想着把题覆盖了,下面的题是供大家查漏补缺用的,真正的把这些题搞懂了,才能“以不变应万变”.回答问题的时候能联系做过项目的例子是最好 ...

  10. 苹果iphone手机上input的button按钮颜色显示有问题,安卓却没问题

    苹果手机中会如类似上图,安卓却可以按自己写的来显示 解决办法: -webkit-appearance: none; 以上即可,当然样式中可以加上通用的: 通用:input[type=button], ...