我的编程空间,编程开发者的网络收藏夹
学习永远不晚

精通MVC3摘译(4)-使用Area

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

精通MVC3摘译(4)-使用Area

使用Areas

MVC Framework支持将一个web application放入一个area,每个area表示一个特殊功能的应用程序片段,比如管理,账单,客户支持等等。这对大型项目很有用,如果大型项目中所有的controller,View和model都只有相应的一个文件夹,那么很难管理,那么此时使用area会很有帮助。

每个MVC有它自己的目录结构,允许你将任何大型隔离。这让多个开发人员开发同一个项目时不产生冲突。Area通过路由系统支持。下面我们会介绍如何建立和使用area。

我们使用Internet Application模板创建一个新的的MVC项目,命名为WorkingWithAreas。

创建Area

在MVC应用程序中增加area,邮件点击项目,选择增加Add Area。Visual Studio会提示输入area名,如下图。这里,我们创建一个area,命名为Admin。这是一个非常常用的area,因为很多web application需要隔离面向客户的功能和管理的功能。

clipboard

点击Add,会发现项目中增加了一个命名为Areas的文件夹,其中包含一个Admin文件夹,表示我们刚刚创建的Area。如果我们创建额外的area,其他的文件夹也会创建在这里。

在Admin文件夹下,你会发现有个小型的MVC项目。里面有Controllers,Models和Views文件夹。前两个是空文件夹,Views文件夹包含一个Shared文件夹和 Web.config( Web.config配置view engine,此处不讨论,后续会说到。)。还有生成了一个AdminAreaRegistration 类。AdminAreaRegistration类如下:

namespace WorkingWithAreas.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 { action = "Index", id = UrlParameter.Optional }

            );

        }

    }

}

这里需要关注的是RegisterArea方法。此方法使用URL模式Admin/{controller}/{action}/{id}注册路由。我们可以在此方法中定义额外的路由。

注意,如果你命名了你路由,你必须保证这个命名在整个应用程序中是唯一的,而不是仅仅在area中。

我们不需要做什么来保证这个注册方法能被调用,Global.asax的Application Start 方法自动帮我们处理了。如下:

protected void Application Start() {

AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);

    RegisterRoutes(RouteTable.Routes);

}

静态方法 AreaRegistration.RegisterAllAreas能使MVC Framework遍历我们应用程序中的所有的类,找出那些继承于AreaRegistration类的子类,调用他们的RegisterArea方法。

注意,不要改变 Application Start方法中有关路由语句的顺序。如果你在调用AreaRegistration前调用RegisterRoutes,那么你的路由在area routes路由之前被拒绝。

传递给每个area的RegisterArea方法的AreaRegistrationContext类提供了一组MapRoute方法,通过该方法,area可以用和主程序相同的方法注册routes。

注意,AreaRegistrationContext类中的MapRoute方法自动限制你注册命名空间,这意味当你在area创建controller,你必须使用它默认的命名空间,不然路由系统找不到他。


加入到Area

如之前的例子,你可以在area中创建controller,view和model。创建controller,只需要右键点击Controller文件夹,选择Add Controller,输入名字。

clipboard[1]

此例中我们增加一个HomeController。

using System.Web.Mvc;

namespace WorkingWithAreas.Areas.Admin.Controllers {

    public class HomeController : Controller {

    public ActionResult Index() {

        return View();

    }

    }

}

为了完成这个例子,我们为Homecontroller的Index方法通过点击右键创建view,使用默认的名字Index。一旦创建完毕,你会发现在 Areas/Admin/Views/Home目录下的view。view的代码如下:

@{

    ViewBag.Title = "Index";

}

<h2>Admin Area Index</h2>

这个例子可以看到,area中的工作方式和在MVC项目的主项目是一样的,如果输入导航/Admin/Home/Index,会看到如下界面:

clipboard[2]

解决Controller混淆的问题

之前,我们撒了一点小谎,先前的例子,如果你导航到application的跟URL,会出现一个错误,和之前的错误很相似。

clipboard[3]

When an area is registered, any routes that we define are limited to the namespace associated with the area. This is how we were able to request /Admin/Home/Index and get the HomeController class in the

WorkingWithAreas.Areas.Admin.Controllers namespace.

However, routes defined in the RegisterRoutes method of Global.asax are not similarly restricted.

You can see the default routing configuration that Visual Studio puts in place in Listing 11-53.

当一个area注册了,我们定义的任何路由都限制了命名空间和area的关联。所以我们这样请求 /Admin/Home/Index,并且在WorkingWithAreas.Areas.Admin.Controllers 命名空间获得HomeController类。但是, Global.asax中RegisterRoutes 方法中的路由定义却没有被限制,如下,你可以看到默认的路由配置:

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 }

    );

}

名称为Default的路由把浏览器发来的URL转换成Home controller的Index action。在此,我们得到一个error,因为,此处没有命名空间限制路由,MVC Framework可以看到2个HomeController。要解决这种问题,我们需要给Global.asax中的主controller命名空间以优先权。如下:

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 },

new[] {"WorkingWithAreas.Controllers"}

);

}

这个修改保证了主项目中的controller获得了优先权。当然,你也可以给area中的controller优先权。

在Area中生成为Action生成Link

You don’t need to take any special steps to create links that refer to actions in the same MVC area that

the user is already on. The MVC Framework detects that the current request relates to a particular area,

and then outbound URL generation will find a match only among routes defined for that area. For

example, this addition to the view in our Admin area:

Area中不需要特殊的步骤创建link,就如同在MVC中一样。MVC Framework发现当前请求与某个area有关,然后会在area里定义的路由中找到一个匹配来生成URL。比如:

@Html.ActionLink("Click me", "About")

生成如下的html

<a href="/Admin/Home/About">Click me</a>

要创建不同area中的action的link,你必须创建一个area变量,使用它设置你需要的area的名字,比如:

@Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" })

这也是为什么area也是片段变量名的保留字。HTML由调用生成的HTML如下:

<a href="/Support/Home">Click me to go to another area</a>

如果你想链接到一个top-level controllers的action(在 /Controllers目录中的controller),那么你需要知道area为空字符串,就像:

@Html.ActionLink("Click me to go to another area", "Index", new { area = "" })

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

精通MVC3摘译(4)-使用Area

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

精通MVC3摘译(4)-使用Area

使用Areas MVC Framework支持将一个web application放入一个area,每个area表示一个特殊功能的应用程序片段,比如管理,账单,客户支持等等。这对大型项目很有用,如果大型项目中所有的controller,Vi
2023-01-31

精通MVC3摘译(2)-生成URL

处理发来的URL只是MVC中的一部分,我们也需要生成一些URL植入到我们的view中,让用户点击,并提交表单到目标controller和action,下面会介绍一些生成URL的技巧。最快速直接的定义外链URL的方法就是手动拼写。比如下面的U
2023-01-31

精通MVC3摘译(3)-自定义路由系统

路由系统非常灵活,但是如果这还不能满足你的 需求,那么,你可以定制路由系统。创建基于RouteBase 的接口如果你不喜欢标准路由对象匹配URL的方式,或者你想实现一些特殊的接口,你可以从RouteBase中继承一个类。让你可以控制URL匹
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录