请注明转载地址: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的其他子类。

一步步学习ASP.NET MVC3 (7)——Controller,Action,ActionResult的更多相关文章

  1. 一步步学习ASP.NET MVC3 章节总结

    请注明转载地址:http://www.cnblogs.com/arhat 对于<一步步学习ASP.NET MVC3>系列工15章,那么为了方便大家能够快速的预览,老魏在这里为这个系列提供一 ...

  2. 一步步学习ASP.NET MVC3 (1)——基础知识

    请注明转载地址:http://www.cnblogs.com/arhat 首先在这里我想声明一下,这个ASP.NET MVC3系列是我在授课过程中的一些经验,有什么不对的地方,请大家指出,我们共同的学 ...

  3. 一步步学习ASP.NET MVC3 (12)——FileResult

    请注明转载地址:http://www.cnblogs.com/arhat 忙了两天,本来老魏昨天就应该写出新的文章,但是由于昨天雨夹雪而且加上昨天晚上加了班,到家都没饭吃了,一看时间都9点了,什么饭店 ...

  4. 一步步学习ASP.NET MVC3 (3)——Razor(1)

    请注明转载地址:http://www.cnblogs.com/arhat 首先这个<一步步学习ASP.NET MVC3>前段时间有些忙,没有顾得上写文章,昨天呢写了3个和ASP.NET的相 ...

  5. 一步步学习ASP.NET MVC3 (2)——入门程序

    请注明转载地址:http://www.cnblogs.com/arhat 在上一节中,我们只是简单的介绍了什么是MVC及MVC的运行原理.而本节呢,主要来实现下一ASP.NET MVC3的开发流程,并 ...

  6. 一步步学习ASP.NET MVC3 (14)——Route路由

    请注明转载地址:http://www.cnblogs.com/arhat 由于今天是星期六,所以多写几篇,感觉前几天的忙碌没有及时发布文章,趁着周末老魏尽力的多写几篇文章.因为本系列基本上快结束了,所 ...

  7. 一步步学习ASP.NET MVC3 (5)——View从Action中获得数据

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们把Razor的模板技术给大家介绍了一下,当然模板中还有其他的知识点,这个以后我们还会继续讲解.本章我们主要讨论 ...

  8. 一步步学习ASP.NET MVC3 (8)——EmptyResult,ContentResult,RedirectResult

    请注明转载地址:http://www.cnblogs.com/arhat 上一章,我们阐述了Controller,Action和ActionResult所代表的含义及使用,本章继续研究ActionRe ...

  9. 一步步学习ASP.NET MVC3 (9)——JsonReslt,JavaScript,@Ajax

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们讲述了ActionResult的三个子类,非别是EmptyResult,RediretResult和Conte ...

随机推荐

  1. Android NDK STL

    相信Android开发者都喜欢用C++编写一些高效的应用,有关Android NDK的C++开发相关知识总结如下:       从Android NDK r5开始支持了STL Port,在这个版本开始 ...

  2. [转]c#.NET和VB.NET语法的比较

    本文转自:http://www.cnblogs.com/lify0407/archive/2007/08/01/838589.html c#.NET和VB.NET语法的比较   VB.NET C# C ...

  3. [问题] PHP接收Request payload传递过来的参数

    在使用Apidoc的时候,有一个配置参数是 @apiSampleRequest http://localhost/api 在测试时,发现发送的参数是Request payload的,而PHP中使用的A ...

  4. 今天学习image在html中的应用

    今天学习image在html中的应用 上次在学习超级链接的使用中有一小问题,是在添加网址中href="http://www.baidu.com" 中不能忘记http://,否则链接 ...

  5. Android Drawable系列(1):自定义背景以及注意事项

    0. Shape自身属性 android:shape=["rectangle" | "oval" | "line" | "ring ...

  6. Android——控制UI界面

    一.使用XML布局文件控制UI界面 res\layout\activity_main.xml代码如下: <FrameLayout xmlns:android="http://schem ...

  7. 转载---SQL Server XML基础学习之<6>--XQuery的 value() 方法、 exist() 方法 和 nodes() 方法

    /*------------------------------------------------------------------------------+ #| = : = : = : = : ...

  8. ExtJs store加载

    当store加载数据对象中,如果带有success:false,store会认为加载数据失败,不予将得到的数据显示在界面上,所有记得在返回数据对象的同时返回success:true;

  9. ios registerNib: and registerClass:

    先看看apple官网简述: registerNib:forCellWithReuseIdentifier: Register a nib file for use in creating new co ...

  10. C# ACM poj1008

    玛雅历 public static void Acm1008(int day, string mon, int year) { ; switch (mon) { case "pop" ...