当前位置: 首页 > news >正文

MVC2 Area实现网站多级目录

Areas是ASP.NET Mvc 2.0版本中引入的众多新特性之一,它可以帮你把一个较大型的Web项目分成若干组成部分,即Area。实现Area的功能可以有两个组织形式:

  1. 在1个ASP.NET Mvc 2.0 Project中创建Areas。
  2. 创建多个ASP.NET Mvc 2.0 Project,每个Project就是一个Area。

第2种结构比较复杂,但第1种结构同样可以做到每个Area之间的并行开发,互不影响,所以不推荐第2种方法。

 

以ASP.NET Mvc 2.0的默认模板为例:

1. 首先要新建一个ASP.NET Mvc 2.0的Project,在Project上点击鼠标右键选择Add->Area,在打开的窗口中输入Area的名子(例如:Profile),点击Add按钮,然后将看到下面的结构。P

名子叫做Profile的Area的结构与根目录下的Controllers,Models和Views的结构是一样的,唯一区别是Profile下面多了一个ProfileAreaRegistration.cs文件。它继承自AreaRegistration类,ProfileAreaRegistration 必须实现AreaRegistration类中的AreaName属性和RegisterArea(AreaRegistrationContext context)方法

using System.Web.Mvc;  
namespace ASP.NET_Mvc_2_Test.Areas.Profile 
{     
    public class ProfileAreaRegistration : AreaRegistration     
    {          public override string AreaName {  get{return "Profile";} }  public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute(  "Profile_default",  "Profile/{controller}/{action}/{id}",  new { action = "Index", id = UrlParameter.Optional}); } } }

AreaName属性用来定义Area的名子, RegisterArea(AreaRegistrationContext context) 方法中可以看出在浏览器的地址栏中URL的样式为Profile/{controller}/{action}/{id},是4级构结,只要将context.MapRoute(…)改为

public override void RegisterArea(AreaRegistrationContext context)         
{             
    context.MapRoute(
           "Profile_default", 
           "Profile/{action}/{id}", 
           new { controller = "要访问的controller名子", action = "Index", id = UrlParameter.Optional }); }

URL的样式会再变为三级结构 Profile/{action}/{id}。

 

2. 修改根目录下Views/shared/Site.Master文件,并添加一个名为o”Your Profile”的菜单项并指定area的名子, 示例中Area的名子为Profile。  

<ul id="menu">                                   
     <li><%= Html.ActionLink("Home", "Index", "Home", new { area = ""}, null)%></li> <li><%= Html.ActionLink("Your Profile", "ViewProfile", "Profile", new { area = "Profile" }, null)%></li> <li><%= Html.ActionLink("About", "About", "Home", new { area = ""}, null)%></li> </ul>

注意:Home和About不属于任何Area,但是也要通过匿名对象的方式声明area,如果没有声明Area,当进入到 Profile的某个view时, Home和About的会的URL会变为Profile/Home, Profile/About,点击Home或About时会有异常抛出,所以当页面上的某个链接不属于任何一个Area并且有可能被多个Area可享的 话,一定要加上new { area = ""}

 

3. 只有匹配正确的Route才能显示Area中的View,Area中的Route已经配置好,但它是如何被加入到RouteTable中的?

 


 

 

项目分为三个首页 

如:  /Home/Index 前台首页

         /Admin/Home/Index 后台首页

         /OA/Home/Index 办公平台首页

新建一个asp.net MVC3 示例项目: 右键 →添加→Area

prj

直接运行项目:加载中...

原因是存在同名的多个Controller,需要配置默认的命名空间。解决方法:

打开Global.asax.cs

public static void RegisterRoutes(RouteCollection routes) {      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

     routes.MapRoute(         "Default", // Route name         "{controller}/{action}/{id}", // URL with parameters         new { controller = "Home", action = "Index", id = UrlParameter.Optional },// Parameter defaults         new[] { "Web.Controllers" }// Namespaces 引入默认的命名空间         );

}

http://localhost:49849/ 运行后输出  Home/Index

http://localhost:49849/Admin/Home/Index 运行后输出  Admin/Home/Index

http://localhost:49849/OA/Home/Index 运行后输出 OA/Home/Index

更改路径:

http://localhost:49849/Admin/ www.2cto.com后报404错误

原因是 Area下面的Admin没有配置默认的 Controller造成的,解决方法:

打开 Area下Admin下 AdminAreaRegistration.cs

new { controller = "Home", action = "Index", id = UrlParameter.Optional }

加上默认的Controller即可。

相关文章:

  • IBM Java多线程 - 4.共享对数据的访问
  • TADOQuery池
  • Windows7问题集
  • 连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑
  • 应用开发框架之——业务规则脚本化
  • 对等计算实践: P2P 遇上 SSL
  • Sprout and the Bean
  • 数据库水平拆分和垂直拆分区别(以mysql为例)
  • 跟我一起学WCF(11)——WCF中队列服务详解
  • 第6期(江西省吉安市永丰县)县长手机信箱工作简报(自吹自擂政绩,自圆其说)
  • 各种排序算法的稳定性和时间复杂度小结
  • Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等...
  • 前端设计模式(0)面向对象设计原则
  • 专访Connolly:为什么我们需要手动回归测试宣言?
  • jedis连接服务超时connect timed out
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 5、React组件事件详解
  • android图片蒙层
  • Angular4 模板式表单用法以及验证
  • Gradle 5.0 正式版发布
  • JavaScript HTML DOM
  • javascript从右向左截取指定位数字符的3种方法
  • java多线程
  • JS字符串转数字方法总结
  • react 代码优化(一) ——事件处理
  • Sass 快速入门教程
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue脚手架vue-cli
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 工程优化暨babel升级小记
  • 基于遗传算法的优化问题求解
  • 使用docker-compose进行多节点部署
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 一道面试题引发的“血案”
  • 移动端 h5开发相关内容总结(三)
  • 赢得Docker挑战最佳实践
  • 鱼骨图 - 如何绘制?
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #{}和${}的区别?
  • #1014 : Trie树
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (C语言)逆序输出字符串
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (一)appium-desktop定位元素原理
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转载)OpenStack Hacker养成指南
  • .apk文件,IIS不支持下载解决