MVC 学习系列-Controller

  • 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包含:

 1  // Note: For instructions on enabling IIS6 or IIS7 classic mode,
 2     // visit http://go.microsoft.com/?LinkId=9394801
 3
 4     public class MvcApplication : System.Web.HttpApplication
 5     {
 6         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 7         {
 8             filters.Add(new HandleErrorAttribute());
 9         }
10
11         public static void RegisterRoutes(RouteCollection routes)
12         {
13             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
14
15             routes.MapRoute(
16                 "Default", // Route name
17                 "{controller}/{action}/{id}", // URL with parameters
18                 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
19             );
20
21         }
22
23         protected void Application_Start()
24         {
25             AreaRegistration.RegisterAllAreas();
26
27             RegisterGlobalFilters(GlobalFilters.Filters);
28             RegisterRoutes(RouteTable.Routes);
29         }
30     }

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

 1 using System.Web.Mvc;
 2
 3 namespace mvcPro.Areas.Max_Admin
 4 {
 5     public class Max_AdminAreaRegistration : AreaRegistration
 6     {
 7         public override string AreaName
 8         {
 9             get
10             {
11                 return "Max_Admin";
12             }
13         }
14
15         public override void RegisterArea(AreaRegistrationContext context)
16         {
17             context.MapRoute(
18                 "Max_Admin_default",
19                 "Max_Admin/{controller}/{action}/{id}",
20                 new { action = "Index", id = UrlParameter.Optional }
21             );
22         }
23     }
24 }

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

怎么处理:

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

 1  public static void RegisterRoutes(RouteCollection routes)
 2         {
 3             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 4
 5             routes.MapRoute(
 6                 "Default", // Route name
 7                 "{controller}/{action}/{id}", // URL with parameters
 8                 new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
 9                 new[] { "mvcPro.Controllers" }
10             );
11
12         }

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

1  public override void RegisterArea(AreaRegistrationContext context)
2         {
3             context.MapRoute(
4                 "Max_Admin_default",
5                 "Max_Admin/{controller}/{action}/{id}",
6                 new { action = "Index", id = UrlParameter.Optional }, // Parameter defaults
7                 new[] { "mvcPro.Areas.Max_Admin.Controllers" }
8             );
9         }

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

时间: 2024-10-08 19:05:41

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

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

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

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

转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax

MVC学习系列——ModelBinder扩展

在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POST一个XML数据类型给我们项目,这样的话,我们需要自定义一个XmlModelBinder来接受XML数据. 新建XmlModelBinder,继承于:IModelBinder 1 public class XmlModelBinder : IModelBinder 2 { 3 public obje

MVC 学习系列

总是很难说清MVC的概念,即使读了源代码后(读的时候有些东西,理解起来还是有点吃力),也依然能难对整体的每一个具体的原理说的一清二楚.为了达到自己学习的目的,我把自己的学习路线写成文章,一边自己能对MVC有深刻的认识. 尽管也看了一些关于MVC的书籍,但还是很难分清MVP,MVVM,MVC的概念区分,先抛弃之前的概念的区分,先体验后在总结吧. MVC文章系列: 1,)mvc controller控制器

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

这个系列是,基础学习系列的最后一部分,这里,我打算翻译一篇国外的技术文章结束这个基础部分的学习:后面打算继续写深入学习MVC系列的文章,之所以要写博客,我个人觉得,做技术的,首先得要懂得分享,说不定你自己以为正确的东西,存在瑕疵,分享出来,大家也可以互相进步.这样整个生态圈也会越来越好.不是么?   好了,闲话扯远了,下面开始正题吧,一下是英文和中文对照,翻译的不好,请见谅. This article introduces how to improve ASP.NET MVC Applicati

MVC学习系列-基础了解

ASP.NET 是一个开发框架,用于通过 HTML.CSS.JavaScript 以及服务器脚本来构建网页和网站.ASP.NET 支持三种开发模式:Web Pages.MVC (Model View Controller) 以及 Web Form.下面首先区别比较一下Web Form 和MVC这两种设计模式,接着进行基础知识的讲解. 一.两种设计模式的区别 1.WebFrom 这种设计模式的实现方式有两种 (1)aspx前端页面+服务器控件(为控件设置事件响应方法) (2)aspx前端页面+异步

ASP.NET MVC学习系列(一)-WebAPI初探

由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主要还是开发WebForm的项目,所以MVC的东西也就逐渐的淡忘了. 经过这一段时间的系统学习,真的觉得MVC3相比于之前的MVC2还有WebForm来说,确实有一种让人欲罢不能爽歪歪的感觉.特别是Razor语法.Linq表达式等的结合运用. 为了将学习过程中遇到的一些值得留意的问题和知识点进行一个很

MVC学习系列5--Layout布局页和RenderSection的使用

我们开发网站项目的时候,都会遇到这样的问题:就是页面怎么统一风格,有一致的外观,在之前ASP.NET的时代,我们有两种选择,一个是使用MasterPage页,一个是手动,自己在每个页面写CSS样式,但这样代码量太大了..不可取,那么到了ASP.NET MVC时代,有什么技术可以统一页面风格呢???有,那就是Layout布局视图.下面就开始学习吧. 1. 首先使用空模板,新建一个MVC Web项目: 新建完成之后,初始化状态是: 2.接着在根目录[LayoutMVC这里是]下,新建一个文件夹[Co

MVC学习系列[email protected]辅助方法和用户自定义HTML方法

在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类,分成三个类型: Inline HTML helpers[内联的HTML帮助类,例如@Html.Label等] Built-in HTML helpers[也就是嵌套的HTML帮助类,即@helper辅助方法] Custom HTML helpers[自定义的HTML帮助类] 在这里,我们学习第二种,