一步步学习ASP.NET MVC3 (7)——Controller,Action,ActionResult
请注明转载地址:http://www.cnblogs.com/arhat
前面几章我们讲解的都是关于View方面的知识,虽然还有很多关于View的知识没有讲,但是没关系,我们在后面使用到的时候在讲解,因为有些View的知识是要和Controllrer结合使用的。所以从本章开始,我们开始讲解Controller的知识。
在第二章的时候,我们简单的了解了Controller(控制器),知道他是整个MVC的核心。那么下面我们仔细的了解一下Controller。
Controller在ASP.NET MVC中负责所有的客户端与服务器之间的交互,可以说起到了核心的角色。如何更好的了解Controller呢,我们从生活中一个例子来学习。在生活中,我们假设有三个角色分别是:“厂家”,“批发商”,“零售商”。这个三个角色分别有自己的角色。大家很容易的就分析出“批发商”是中间的环节,他从“厂家”得到货物,让后“批发商”再把货物发送到“零售商”的手里进行销售,至于“零售商”如何去卖这些商品“批发商”不管,而“批发商”把货物卖给哪个“零售商”,“厂家”也不管。从这个例子中,我们和MVC结合到一起来理解,“厂家”我们可以认为是Model,“批发商”认为是Controller,而“零售商”就是View了。那么大家可以看到Controller从Model中获得数据并交给View,而View则负责显示数据。至于View怎么显示就和Controller无关了。不知道上面的例子,大家能不能明白Controller,Model,View之间的关系呢?
下面我们具体看看Controller的结构,Controller本身就是一个类,这个类有许多的方法,如果这些方法都是pubilc类型的,那么我们把这些方法称之为动作(Action)。而这写动作就是用来和客户端和服务器端的进行交互的核心。
在ASP.NET MVC中,创建一个Controller的时候,这个类必须是是以Controller来结尾的。比如我们创建一个Home控制器,那么他的类名就必须是“HomeController”,同时这个类要继承于Controller。下面我们来看一下一个HomeController。
public class HomeController : Controller { public ActionResult Index() { return View(); } }
刚才我们说过了,Controller中的公共方法就是一个Action。那么这个Controller的Index方法就是一个Action方法。从这个控制器中,我们可以看出,一个Controller基本要求是:
1,必须是public类型的类
2,Controller必须以Controller结尾
3,继承于系统提供的Controller类
4,如果是Action方法,则这个方法必须是public的。
一般情况下,当创建一个Controller的时候,那么Views文件夹下就应该有一个文件夹和这个Controller的名字一样。这个是ASP.NET MVC的约束。当然在特定的条件下,不一定非要有这个View文件夹,比如Ajax等等。
那么大家会看到Controllers文件夹下有两个Controller:About和Home。那么在Views文件下,就有两个文件和Controlller的名字一样。这两个文件夹下所存放的是有关控制器下的视图文件。
从上面的代码可以看出,HomeController中有一个Index的动作方法,那么这个方法一般情况下是要在Views/Home/下面有一个Index.cshtml的视图文件与之对应。而这个视图文件的名字要和Action的名字是一样的。当然,在后面我们会讲到Action不一定要和视图文件相对应。
上面所讲解的是Controller,Action和View之间的对应关系。下面主要来研究一个Action和View之间的实际操作。因为大家知道,实际上是Action接受了看客户端的请求,并根据客户端的请求来决定显示那个View。
那么现在问题来了,一个Action怎么知道要调用按个视图呢?我们来分析一个Action。
public ActionResult Index() { return View(); }
这个Index的动作方法,我们可以看出有两个地方需要我们注意的地方,一个是返回值的类型ActionResutl,另一个是返回值View()。我们先看一下ActionResult的解释:ActionResult是Action运行后要发送给浏览器的结果,而从帮助文档上看ActionResult是一个抽象类,那么很显然View()函数的返回值肯定是继承了ActionResult。而View()函数返回的类型是ViewResult。下面我们来主要研究一下ViewResult
ViewResult是ASP.NET MVC 中最常用的ActionResult,用于返回一个标准的View页面。而至于返回那个View就看Action的名字,一般情况下,返回的是和Action同名的View页面。所以这也是为什么执行HomeController/Index方法的时候,返回的是Views/Home/Index.cshtml文件了。
我们来看一下View()函数的定义:
protected internal ViewResult View(); protected internal ViewResult View(IView view); protected internal ViewResult View(object model); protected internal ViewResult View(string viewName); protected internal virtual ViewResult View(IView view, object model); protected internal ViewResult View(string viewName, object model); protected internal ViewResult View(string viewName, string masterName); protected internal virtual ViewResult View(string viewName, string masterName, object model);
我们看到了View()函数别重载了8次了,其中View()这个是默认的调用方式,用来返回和Action同名的视图文件。那么如果我想使用默认的视图文件怎么办?我们可以使用View(String viewName)这个重载函数。
比如我们在Views/Home创建一个新的视图文件“A.cshtml”。内容如下:
这是A页面
此时我们更改下一Index方法。
public ActionResult Index() { return View(“A”); }
按理说,在访问HomeController/Index的时候应该加载的是A.cshtml文件,那么到底是不是呢?我们预览一下,发现显示的结果的确是A页面。
那么此时,我们在更改一下Index方法。内容如下:
public ActionResult Index() { return View(“B”); }
同理,在预览器中预览的时候,应该打开的是Views/Home/B.cshtml。但是此时Views/Home/没有B.cshtml,那么会出现什么情况呢?
没有找到B页面,但同时我们了解到了View函数查找视图的顺序,如果Views/Home下面没有,则去Views/Shared中找。那么我们现在在Views/Shared中创建一个B.cshtml文件。然后在预览一下,看看结果。
至于其他的View()重载函数,大家可以自行研究,如果后续用的到,我们再去讲解。同时本章主要讲解了ActionResult的一个子类:ViewResult.也知道了ViewResult就是代表了视图文件,同时知道了ViewResult在查找视图的顺序。这能帮帮助我们在开发的时候如何去管理我们的视图文件。
那么本章就到此结束,下一章我们继续讲解ActionResult的其他子类。