转载地址:http://www.cnblogs.com/dudu/archive/2012/12/14/asp-net-mvc-area.html

【摘要】本文只是为一行代码而分享

context.MapRoute("API", "api/{controller}/{action}", new { }, newstring[] { "CNBlogs.UcHome.Web.Controllers.Api" });

我们在ASP.NET MVC中使用Area时通常这么干:

在Web项目中创建Areas文件夹,在其中创建对应的Area文件夹,在其下创建Controllers文件夹。然后在Area文件夹中创建AreaRegistration的子类用于注册Area路由,在Controllers文件夹中创建所需的Controller。

这么干有个前提,就是你的Web项目类型要是WebApplication。

而我们所处的场景是:Web项目类型是WebSite。之前在使用MVC时,将所有的Controller放在了一个单独的类库项目中。

我们今天有一个需求,需要用area来解决。为什么要用area?举个例子来说明。

比如我们在页面中添加网摘时,访问的网址是 home.cnblogs.com/wz/add ,而供其他应用调用网摘API的网址是 home.cnblogs.com/api/wz/add 。这里的wz对应的控制器名称都是WzController,Action都是add,实际也的确存在两个WzController,放在不同的文件夹中。如上图,一个在项目根文件夹,一个在Api文件夹。所以在网址中通过api前缀路径来区分,在程序中也要让ASP.NET路由找到对应的Controller。

这时Area就发挥作用了,但由于Conroller不在Web项目中,所以要找其他方法解决这个问题。方法来自Migrating a large web application to ASP.NET MVC(关键在最后一行代码):

When AreaRegistration.RegisterAllAreas() is called, ASP.NET will search for all AreaRegistration subclasses in all assemblies in the bin dir so that we do not have to modify the global.asax when we add new areas.

In the AreaRegistration subclass, we would do something like:

public override void RegisterArea(AreaRegistrationContext context)
{context.MapRoute("Services","Sub1/Sub11/Sub111/{controller}.mvc/{action}/{id}",new { action = "Index", id = "" },new string[] { "My.Custom.Namespace.Controllers" });
}

AreaRegistration.RegisterAllAreas()是global.asax中调用的,它会找到所有的AreaRegistration的子类,不管是在Web项目中,还是在其他类库项目中。所以我们在CNBlogs.UcHome.Web.Controllers项目的Api文件夹中放一个AreaRegistration的子类,也是能被找到的,然后在注册Area时,在参数中传递Controller所在的命名空间,问题就解决了。

【更新】

虽然通过ApiArea解决了api的路由问题,但是这时我们访问非api的路径(比如/wz/my),出现下面的错误:

Multiple types were found that match the controller named 'wz'. This can happen if the route that services this request ('{controller}/{action}/{id}') does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.

The request for 'wz' has found the following matching controllers:
CNBlogs.UcHome.Web.Controllers.Api.WzController
CNBlogs.UcHome.Web.Controllers.WzController

也就是说,如果有两个同名的Controller,必须在路由时指定命名空间,routes.MapRoute的第5个参数就是用于指定命名空间,我开始时不知道有这个参数,于是试图用Area来解决问题,实际是一个错误的解决方法,正确的解决方法是在Global.asax中针对不同的命名添加两个不同的路由,示例代码如下:

routes.MapRoute("API","api/{controller}/{action}",new { },null,new string[] { "CNBlogs.UcHome.Web.Controllers.Api" }
);routes.MapRoute("DefaultMvc","{controller}/{action}/{id}",new { id = UrlParameter.Optional },null,new string[] { "CNBlogs.UcHome.Web.Controllers" }
);

ASP.NET MVC中Area的另一种用法相关推荐

  1. ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式

    准备 在Models文件夹里面新添加Student实体类,用来模拟从Controller向View传递数据,Student类定义如下: using System; using System.Colle ...

  2. 通过源代码研究ASP.NET MVC中的Controller和View(二)

    通过源代码研究ASP.NET MVC中的Controller和View(一) 在开始之前,先来温习下上一篇文章中的结论(推论): IView是所有HTML视图的抽象 ActionResult是Cont ...

  3. 获取ASP.NET MVC中的完整操作URL [重复]

    本文翻译自:Getting full URL of action in ASP.NET MVC [duplicate] This question already has an answer here ...

  4. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  5. ASP.NET MVC中你必须知道的13个扩展点

         ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...

  6. Asp.net mvc中的Ajax处理

    在Asp.net MVC中的使用Ajax, 可以使用通用的Jquery提供的ajax方法,也可以使用MVC中的AjaxHelper. 这篇文章不对具体如何使用做详细说明,只对于在使用Ajax中的一些需 ...

  7. 在 ASP.NET MVC 中使用 Chart 控件

    在 .NET 3.5 的时候,微软就提供了一个 Chart 控件,网络上有大量的关于在 VS2008 中使用这个控件的文章,在 VS2010 中,这个控件已经被集成到 ASP.NET 4.0 中,可以 ...

  8. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    在ASP.NET MVC中使用IIS级别的URL Rewrite 原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的 ...

  9. ASP.NET MVC中实现多个按钮提交的几种方法

    有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...

  10. 在asp.net mvc中使用PartialView返回部分HTML段

    问题链接: MVC怎样实现异步调用输出HTML页面 该问题是个常见的 case, 故写篇文章用于提示新人. 在asp.net mvc中返回View时使用的是ViewResult,它继承自ViewRes ...

最新文章

  1. Asp.net动态生成html页面
  2. Linux下数值计算
  3. 计算机技术应用参考文献,计算机毕业论文参考文献格式
  4. 聊聊rocketmq的RemotingException
  5. UltraEdit不高亮解决办法
  6. [JQuery] jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式
  7. linux交换分区的文件格式为,LINUX的交换分区或交换文件SWAP的查看与维护
  8. 华为有造车实力,却坚决不造整车,这背后有着怎样的无奈与思考?
  9. 使用 Intellij Idea 打包 java 工程为可执行 jar 包
  10. miniblink载入html,winform使用miniblink展示html(全屏)
  11. 图书管理系统的E-R图和数据库模型图
  12. PLSQL下载与安装
  13. 基于法律裁判文书的法律判决预测
  14. 股市底部上证指数与物价上涨的关系01
  15. Anaconda安装教程
  16. android没有adm_Android--Android Studio 打开ADM报错
  17. 二进制与十进制转换器
  18. 【经验总结】Maple看电子书
  19. fb静态区域_FC 与 FB 与 OB 的区别,时间标记冲突与一致性检查 有详细的步骤...
  20. mysql双主架构沈剑_58沈剑:数据库秒级平滑扩容架构方案

热门文章

  1. 【语音增强】基于matlab匹配滤波器语音识别【含Matlab源码 514期】
  2. matplotlib条形图
  3. android无法实例化服务器,android – 无法实例化类型PagerAdapter
  4. python找不到sys模块_在本地目录中找不到模块,存在于sys.path中
  5. python unittest接口测试_Python+unittest 接口自动化测试
  6. step文件查看软件_3D PDF文件转换为step
  7. layer normalization 缺点_优缺点并存的星越,用车感受还是不错的!
  8. 程序打成jar包路径不对、找不到配置文件的解决
  9. 高性能迷你React框架anu发布
  10. adb uninstall