ASP.NET MVC 3教程之控制器与视图

开发 后端
本系列教程将首先从ASP.NET MVC 3的控制器与视图开始讲起,控制器在ASP.NET MVC 3当中是最终处理客户端请求的一个实现。希望本文能给大家一些帮助。

I:控制器和视图的基础概念

  1.控制器的概念

  控制器在ASP.NET MVC3当中是最终处理客户端请求的一个实现,他有个一硬性条件就是必须实现System.Web.Mvc.IController接口,而且类的命名必须要以Controller结尾,尽管按照硬性条件上来说,要自己实现一个接口比较纠结,但幸好的是在ASP.NET MVC3内部已经包含了一个默认的实现,我们只需要把类的命名设置为Controller结尾然后继承System.Web.Mvc.Controller类,立刻就可以轻松地实现了IController接口了.如果你不喜欢这种默认提供的实现方式,而是自己去实现IController的话.下面的代码可以做一个简单的参考:

  1.   usingSystem.Web.Mvc;  
  2.   usingSystem.Web.Routing;  
  3.   namespaceMvcApplication1.Controllers  
  4.   {  
  5.   publicclassNoDefaultController: IController  
  6.   {  
  7.   voidIController.Execute(RequestContextrequestContext)  
  8.   {  
  9.   varhttpContext = requestContext.HttpContext;  
  10.   varresponse = httpContext.Response;  
  11.   response.ContentType = "text/html; charset=utf-8";  
  12.   response.Write("自己的简单实现! Hello World");  
  13.   }  
  14.   }  
  15.   } 

  请注意:控制器类不硬性要求放在*.Controllers命名空间中

image

如果是使用继承默认的类去实现的话代码如下:

  1.   usingSystem.Web.Mvc;  
  2.   namespaceMvcApplication1  
  3.   {  
  4.   publicclassHelloController: Controller  
  5.   {  
  6.   publicActionResultIndex()  
  7.   {  
  8.   returnContent("默认的实现! Hello World");  
  9.   }  
  10.   }  
  11.   } 

  效果图我就不发了.大家可以手动试一试.

  2.视图的概念

  视图的理解比较简单.你可以把视图理解为*.aspx或*.cshtml的文件.但是不是所有的aspx, cshtml文件都可以作为视图,它们必须得属于某一个以控制器名称命名的文件夹当中,而且要按照约定去存放到路径 ~/Views/{controller}/View.cshtml.

  另外视图还包含解析他的ViewEngine(视图引擎),本文在这里不涉及这个高级话题.

image

  我们可以看出在~/Views/{controller}/View.cshtml中的{controller}并不需要像类命名那样以Controller结尾去做文件夹名称.

  3.工作原理图

  当然,内部的工作原理会比这个图复杂得多.在此也仅仅是让大家有个了解而已!如有错误请指出.谢谢!

  提示:MvcHandler实现了IHttpAsyncHandler, IHttpHandler, IRequiresSessionState这三个接口,我在Debug进去的时候发现都是走异步的路线.对于这个处理方式,了解的人希望可以为我解答一下!

  II:控制器

  1.操作方法

  操作方法的含义是指在继承了System.Web.Mvc.Controller类中所定义的返回值的类型可以兼容ActionResult的方法.

  1.   usingSystem.Web.Mvc;  
  2.   namespaceMvcApplication1.Controllers  
  3.   {  
  4.   publicclassHomeController: Controller  
  5.   {  
  6.   ///<summary>  
  7.  ///Hi, 我是Index操作方法  
  8.   ///</summary>  
  9.   ///<returns></returns>  
  10.   publicActionResultIndex()  
  11.   {  
  12.  ViewBag.Message = "Welcome to ASP.NET MVC!";  
  13.   returnView();  
  14.   }  
  15.   ///<summary>  
  16.   ///厄, 我是About操作方法  
  17.   ///</summary>  
  18.   ///<returns></returns>  
  19.   publicActionResultAbout()  
  20.   {  
  21.   returnView();  
  22.   }  
  23.   ///<summary>  
  24.   ///可以为方法添加不是操作方法的特性  
  25.   ///</summary>  
  26.   ///<returns></returns>  
  27.   [NonAction]  
  28.   publicstringNonAction()  
  29.   {  
  30.   return"亲,不好意思噢.我不是操作方法噢,请不要乱调用噢!";  
  31.   }  
  32.   }  
  33.   }  
  34.   同时也可以使用[ActionName(“重命名操作方法”)]特性去重命名操作方法.  
  35.   [ActionName("NewActionName")]  
  36.   publicActionResultRenameAction()  
  37.   {  
  38.   returnContent("利用特性换个马甲");  
  39.   } 

2.操作方法的返回值类型的种类

  目前ASP.NET MVC3默认提供了11种ActionResult的实现

  在System.Web.Mvc命名空间

  ActionResult

  ContentResult

  EmptyResult

  FileResult

  HttpStatusCodeResult

  HttpNotFoundResult

  HttpUnauthorizedResult

  JavaScriptResult

  JsonResult

  RedirectResult

  RedirectToRouteResult

  ViewResultBase

  PartialViewResult

  ViewResult

  代码示例:

  1.   usingSystem.Web.Mvc;  
  2.   namespaceMvcApplication1.Controllers  
  3.   {  
  4.   publicclassActionResultController: Controller  
  5.   {  
  6.   publicActionResultIndex()  
  7.   {  
  8.   returnView();  
  9.   }  
  10.   publicActionResultContentResult()  
  11.  {  
  12.   returnContent("Hi, 我是ContentResult结果");  
  13.   }  
  14.   publicActionResultEmptyResult()  
  15.   {  
  16.   //空结果当然是空白了!  
  17.   //至于你信不信, 我反正信了  
  18.   returnnewEmptyResult();  
  19.   }  
  20.   publicActionResultFileResult()  
  21.   {  
  22.   varimgPath = Server.MapPath("~/demo.jpg");  
  23.   returnFile(imgPath, "application/x-jpg""demo.jpg");  
  24.   }  
  25.  publicActionResultHttpNotFoundResult()  
  26.   {  
  27.   returnHttpNotFound("Page Not Found");  
  28.   }  
  29.   publicActionResultHttpUnauthorizedResult()  
  30.   {  
  31.   //未验证时,跳转到Logon  
  32.   returnnewHttpUnauthorizedResult();  
  33.   }  
  34.   publicActionResultJavaScriptResult()  
  35.   {  
  36.   stringjs = "alert(\"Hi, I'm JavaScript.\");";  
  37.   returnJavaScript(js);  
  38.   }  
  39.   publicActionResultJsonResult()  
  40.   {  
  41.   varjsonObj = new 
  42.   {  
  43.   Id = 1,  
  44.   Name = "小铭",  
  45.   Sex = "男",  
  46.   Like = "足球" 
  47.   };  
  48.   returnJson(jsonObj, JsonRequestBehavior.AllowGet);  
  49.   }  
  50.   publicActionResultRedirectResult()  
  51.  {  
  52.   returnRedirect("~/demo.jpg");  
  53.   }  
  54.   publicActionResultRedirectToRouteResult()  
  55.   {  
  56.   returnRedirectToRoute(new{  
  57.   controller = "Hello", action = "" 
  58.   });  
  59.   }  
  60.   publicActionResultViewResult()  
  61.   {  
  62.   returnView();  
  63.   }  
  64.   publicActionResultPartialViewResult()  
  65.   {  
  66.   returnPartialView();  
  67.   }  
  68.   //禁止直接访问的ChildAction  
  69.   [ChildActionOnly]  
  70.   publicActionResultChildAction()  
  71.   {  
  72.   returnPartialView();  
  73.   }  
  74.   //正确使用ChildAction  
  75.   publicActionResultUsingChildAction()  
  76.   {  
  77.   returnView();  
  78.   }  
  79.   }  
  80.   } 

  请注意,个别的操作方法结果在执行时,他们返回的HTTP状态码及ContentType有差别的.~另外如果要知道ContentType到底有多少种设置可参考

  3.操作方法的参数

  在本小节,我仅仅演示如何使URL参数映射到操作方法的参数,对于更复杂的用法,我将会留到 模型 的章节去讲解.

  首先我们需要先添加一个新的路由映射,然后在设置3个占位符参数,它们分别是p1, p2, p3.然后将p1约束为仅字母与数字的组合,p2约束为仅数字,p3没有添加约束.

  1.   routes.MapRoute(  
  2.   "UsingParams",  
  3.   "p/{p1}/{p2}/{p3}",  
  4.   new{  
  5.   controller = "Home",  
  6.   action = "UsingParams" 
  7.   },  
  8.   new{ p1 = "[a-z0-9]+", p2 = @"d+"}  
  9.   ); 

  在添加一个Home控制器的操作方法

  1.   publicActionResultUsingParams(stringp1, intp2, stringp3)  
  2.   {  
  3.   stringoutput = string.Empty;  
  4.   output += "p1 = "+ (p1 ?? "null");  
  5.   output += "<br />p2 = " 
  6.   + (p2.HasValue p2.Value.ToString() : "没有值");  
  7.   output += "<br />p3 = "+ (p3 ?? "null");  
  8.   returnContent(output);  
  9.   } 

  运行效果

这里在弄一个仿YouKu的URL路由设置

路由设置

  1.   routes.MapRoute(  
  2.   "YouKu_Show",  
  3.   "v_{action}/id_{id}.html",  
  4.   new{ controller = "YouKu"},  
  5.   new{ id = "[a-z0-9]{13}"},  
  6.   newstring[] { "MvcApplication1.YouKu"}  
  7.   );  
  8.   routes.MapRoute(  
  9.   "YouKu_PlayList",  
  10.   "v_{action}/{id}.html",  
  11.   new{ controller = "YouKu"},  
  12.   new{ id = "[a-z0-9]{12}"},  
  13.   newstring[] { "MvcApplication1.YouKu"}  
  14.   ); 

  详细代码文末会放出.

  III:视图

  1.视图的语法在很早的时候我已经写过一篇文章了.在此就略过不提.

  2.视图与控制器之间如何进行数据交互

  在前面的接触当中,我们已经对控制器和视图有一定的了解了.接着,我们将要了解他们之间的几种常用的数据交互方式.注意:ASP.NET MVC不存在IsPostBack.如果你需要把WebForm和MVC相结合.那么很抱歉,我个人非常反对这种方式.因为选择MVC的主要原因就是不希望再与runat=server打交道(当然你用ASP.NET开发而不去runat=server的话,是可以实现的).另一点MVC也方便测试.~在过去,如果你要对ASP.NET进行测试,我们可以设想一下,对每个需要测试的runat=server的服务器控件去设置一个预设值的话,由于属性繁多,复杂程度已经可想而知了.另外从根源上并不能保证都能发现所有问题.~或许我的这个测试ASP.NET的猜想根本不成立.而测试的时候往往还需要每Builder一次,然后对需要测试的页面逐个测试检查什么按钮之类的..OK,这些伤心事就不在提了.下面介绍下MVC下的数据交互有那几种方式.

  2.1 ASP.NET MVC不在有IsPostBack,如何实现处理GET,POST?

  首先我帖出一段简单的代码去为你展示ASP.NET MVC3下处理GET, POST的方式

  1.   //默认是处理Get请求,当然你也可以显式添加  
  2.   [HttpGet]  
  3.   publicActionResultUsingViewBag()  
  4.   {  
  5.   returnView();  
  6.  }  
  7.   //显式将操作方法设置处理Post请求  
  8.   [HttpPost]  
  9.   publicActionResultUsingViewBag(stringinput)  
  10.   {  
  11.   if(string.IsNullOrWhiteSpace(input))  
  12.   {  
  13.   ViewBag.Msg = inputBlank;  
  14.   }  
  15.   else 
  16.   {  
  17.   ViewBag.Msg = "你输入了: "+ input;  
  18.   }  
  19.   returnView();  
  20.   } 

  在这里你会发现在ASP.NET MVC下是用[Http*]或[AcceptVerbs(HttpVerbs.*)]特性去实现类似WebForm下的IsPostBack.

  2.2 ASP.NET MVC3的数据交互方式种类

  A:ASP.NET原生的Request,Response.

  System.Web.Mvc.Controller的成员:HttpContext, Request, Response, Session, User都跟WebForm下的类似.

  Request.QueryString,Request.Form,Request.Cookies,RouteData.Values等.

  B:ASP.NET MVC3自带的ViewData,ViewBag,TempData

  1.   usingSystem.Web.Mvc;  
  2.   namespaceMvcApplication1.Controllers  
  3.   {  
  4.   publicclassParamsController: Controller  
  5.   {  
  6.   stringinputBlank = "你输入了空白";  
  7.  publicActionResultIndex()  
  8.   {  
  9.   returnView();  
  10.   }  
  11.   //默认是处理Get请求,当然你也可以显式添加  
  12.   [HttpGet]  
  13.   publicActionResultUsingViewBag()  
  14.   {  
  15.   returnView();  
  16.   }  
  17.   //显式将操作方法设置处理Post请求  
  18.   [HttpPost]  
  19.   publicActionResultUsingViewBag(stringinput)  
  20.   {  
  21.   if(string.IsNullOrWhiteSpace(input))  
  22.   {  
  23.   ViewBag.Msg = inputBlank;  
  24.   }  
  25.   else 
  26.   {  
  27.   ViewBag.Msg = "你输入了: "+ input;  
  28.   }  
  29.   returnView();  
  30.   }  
  31.   publicActionResultUsingViewData()  
  32.   {  
  33.   returnView();  
  34.   }  
  35.   [HttpPost]  
  36.   publicActionResultUsingViewData(stringinput)  
  37.   {  
  38.   if(string.IsNullOrWhiteSpace(input))  
  39.   {  
  40.   ViewData["msg"] = inputBlank;  
  41.   }  
  42.   else 
  43.   {  
  44.   ViewData["msg"] = "你输入了: "+ input;  
  45.   }  
  46.   returnView();  
  47.   }  
  48.   publicActionResultUsingTempData()  
  49.   {  
  50.   returnView();  
  51.  }  
  52.   [HttpPost]  
  53.   publicActionResultUsingTempData(stringinput)  
  54.   {  
  55.   if(string.IsNullOrWhiteSpace(input))  
  56.   {  
  57.   TempData["msg"] = inputBlank;  
  58.   }  
  59.   else 
  60.   {  
  61.   TempData["msg"] = "你输入了: "+ input;  
  62.   }  
  63.  returnView();  
  64.   }  
  65.   }  } 

  更详细的讨论,或许得另写一遍文章了.下一篇写Model,另外关于@Html的扩展方法,我打算另外写一篇去介绍.

  IV:源代码下载

原文:http://www.cnblogs.com/highend/archive/2011/08/04/aspnet_mvc3_controller_and_view.html

【编辑推荐】

  1. 详解ASP.NET MVC 3新的Layout布局系统
  2. ASP.NET MVC中很酷的jQuery验证插件
  3. ASP.NET MVC 3新特性全解析
  4. ASP.NET MVC 3让你疯狂的五大理由
  5. 详解ASP.NET MVC 3 beta新特性

 

责任编辑:彭凡 来源: 博客园
相关推荐

2009-01-12 11:16:58

控制器控制器行为行为结果

2011-04-15 09:20:56

ASP.NET MVC

2009-07-22 17:45:35

ASP.NET教程

2012-02-03 09:06:53

ASP.NET MVC

2010-10-08 14:32:32

ASP.NET MVCNuPack

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-31 12:43:59

ASP.NET MVC

2009-07-30 14:18:02

ASP.NET实例教程

2009-08-24 09:18:34

ASP.NET MVC

2009-03-13 10:58:48

ASP.NetMVC框架编程

2009-07-23 12:22:41

ASP.NET MVC

2011-01-15 23:07:59

2012-06-26 10:24:51

Asp.Net框架Razor

2010-10-12 09:52:02

ASP.NET MVC

2012-05-09 13:29:42

ASP.NET

2009-07-24 09:20:15

数组实例

2009-08-10 14:25:33

ASP.NET服务器控

2009-08-18 17:50:37

ASP.NET MVC

2009-12-08 08:57:21

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC
点赞
收藏

51CTO技术栈公众号