• MVC最核心的也就是Controller了,控制器(controller)在功能中起到了核心功能.

1,)在MVC类库中,根据URL,通过MVCHandler进入MVC处理系统中,

2,)解析初始化对应的Route信息,

3,)在MVCHandler的Begin_RequestHandler函数中,根据URL获取到对应的Controller,和Action,

4,)在执行Controller.Execute之前还需要进行一个验证处理,

5,)之后执行Exceute,

6,)在Execute处理过程中需要包含有验证相关处理,需要先处理验证等,

7,)执行Execute处理相关业务信息,返回View,

8,)之后进一步验证信息,

9,)。。。

这里仅仅提到了一个大概的执行流程,但真正的源代码中我们发现每一步处理,都会包含有若干准备出,

比如:根据Controller,Action名称,获取到对应的Controller,和Action后,怎么执行?

1,) 这里就获取通过反射获取对应的Controller实例对象,之后从ControllerContext上下文中获取到对应的参数,以便反射时填充对应的Action函数参数;

2,)这里还包含一个缓存的地方,当第一次找到一个Controller实例时,MVC框架会自动把这样的实例信息存储起来,以便下一次根据Controller和Action的名称,可以快速找到对应的实例。

  • 下边我们创建一个asp.net mvc3工程,感受下Controller怎么使用。

我创建了一个HomeController,给该Controller创建了一个View(~/views/Home/Index.cshtml);

我再创建一个Area(Max-Admin),于是就又多了一个Area,在Area中包含一个HomeController,这时候我也给该HomeController添加一个View(~/views/Home/Index.cshtml);

调试项目:页面跑出异常(Multiple types were found that match the controller named 'Home'. 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.)

我们从项目中可以看到Global.asax.cs包含:

  // Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
} 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
); } protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}

在Area中也发现一个注册Route的Max_AdminAreaRegistration.cs类,代码片段:

 using System.Web.Mvc;

 namespace mvcPro.Areas.Max_Admin
{
public class Max_AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Max_Admin";
}
} public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Max_Admin_default",
"Max_Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
}

界面上出现发现有多个HomeContoller,这是就跑出异常了,这也正常,通过反射寻找HomeController找到两个,不能决定执行哪一个,理所当然。

怎么处理:

我们分别在Global.asax.cs的RegisterRoute函数中修改代码为:

  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[] { "mvcPro.Controllers" }
); }

修改Max_AdminAreaRegistration.cs函数RegisterArea函数中修改代码为:

  public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Max_Admin_default",
"Max_Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new[] { "mvcPro.Areas.Max_Admin.Controllers" }
);
}

解决方案参考:http://stackoverflow.com/questions/7842293/multiple-types-were-found-that-match-the-controller-named-home

MVC 学习系列-Controller的更多相关文章

  1. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  2. ASP.NET MVC学习系列(二)-WebAPI请求

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  3. ASP.NET MVC学习系列(二)-WebAPI请求(转)

    转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

  4. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  5. ASP.NET MVC学习系列(二)-WebAPI请求 转载https://www.cnblogs.com/babycool/p/3922738.html

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  6. MVC学习系列——ModelBinder扩展

    在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POS ...

  7. MVC学习系列——记一次失败面试后,感想。

    在此写博客之际,热烈庆祝母校苏州科技学院,正式改名为苏州科技大学. 一晃眼,从自己投身IT行业已经两年有余,期间经历了结婚.买房等人生大事,非常感谢我的老婆,谢谢她这么爱我,嫁给我这个码农,呵呵... ...

  8. MVC 学习系列

    总是很难说清MVC的概念,即使读了源代码后(读的时候有些东西,理解起来还是有点吃力),也依然能难对整体的每一个具体的原理说的一清二楚.为了达到自己学习的目的,我把自己的学习路线写成文章,一边自己能对M ...

  9. MVC学习系列14--Bundling And Minification【捆绑和压缩】--翻译国外大牛的文章

    这个系列是,基础学习系列的最后一部分,这里,我打算翻译一篇国外的技术文章结束这个基础部分的学习:后面打算继续写深入学习MVC系列的文章,之所以要写博客,我个人觉得,做技术的,首先得要懂得分享,说不定你 ...

随机推荐

  1. 挑战python

    00 热身 http://www.pythonchallenge.com/pc/def/0.html import math print math.pow(2,38); # 274877906944 ...

  2. solr4.7中文分词器(ik-analyzer)配置

    solr本身对中文分词的处理不是太好,所以中文应用很多时候都需要额外加一个中文分词器对中文进行分词处理,ik-analyzer就是其中一个不错的中文分词器. 一.版本信息 solr版本:4.7.0 需 ...

  3. Andrew Ng机器学习公开课笔记 -- Online Learning

    网易公开课,第11课 notes,http://cs229.stanford.edu/notes/cs229-notes6.pdf   和之前看到的batch learning算法不一样,batch ...

  4. 坑人的七牛CDN

    最近七牛CDN不知道咋啦的,一下子就不行了,提示错误信息如下 "upload image source key fail: unexpected EOF" 找客服提交工单都没有解决 ...

  5. 使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码

    正文: 在编程中,无论是OC还是C亦或是C++语言,所声明的整数变量都会在内存中占有固定的存储空间,而这些存储空间都是固定的. 比如我们知道的int.long.short.unsigend int.u ...

  6. iOS开发之Objective-c的MD5/SHA1加密算法的实现

    Objective-c实现MD5和SHA1算法相对还是比较简单的,可以直接调用系统的C/C++共享库来实现调用 MD5即Message Digest Algorithm 5(信息-摘要算法 5),用于 ...

  7. from xml

    /** * 将xml转为array * @param string $xml * @throws WxPayException */ public function FromXml($xml) { i ...

  8. 从高版本JDK换成低版本JDK报错Unsupported major.minor version 52.0

    ava.lang.UnsupportedClassVersionError: PR/Sort : Unsupported major.minor version 52.0这个错误是由于高版本的java ...

  9. Java 实现导出excel表 POI

    1.首先下载poi-3.6-20091214.jar 2.Student.java import java.util.Date; public class Student { private int ...

  10. img图片之间的间距问题

    [问题]页面中如果有多张图片,那么图片之间会有一些间距,在某些情况下(如切好的图片再次拼接),在显示上就会出现一些问题.效果如下: 对应代码: <div class="f0" ...