原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303672.html

Controller是MVC中比較重要的一部分。差点儿全部的业务逻辑都是在这里进行处理的,而且从Model中取出数据。

在ASP.NET MVC Preview5中。将原来的Controller类一分为二,分为了Controller类和ControllerBase类。

Controller类继承自ControllerBase类,而ControllerBase实现是了IController接口。

ControllerBase实现了IController接口的Execute方法,在Route匹配到Controller之后。就会调用Execute方法来进入Controller的处理。

这里还定义了一个抽象的方法ExecuteCore方法,该方法会在Execute方法的最后被调用。ControllerBase还定义了三个核心的属性。我们在后面会具体讨论TempData和ViewData。

Controller类除了继承自ControllerBase类以外。还实现了好几个Filter接口。Filter我们在后面再具体讨论。

public abstract class Controller
: ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter{ }

Controller类还定义非常多实用的方法,我们新建的Controller都必须继承自这个Controller类。比如我们新建一个AdminController:

public class AdminController : Controller
{
}

Action方法

以下谈一下在Controller中比較重要的Action方法。在ASP.NET MVC中URL都是映射到Controller中的某个Action中,然后由匹配的Action来处理我们的业务逻辑并返回view的。

Controller中的public的方法都被当作是Action方法。Action方法通常返回一个ActionResult的结果。比如我们为前面的AdminController定义一个Setting的Action方法。用于设置Blog的一些基本參数:


public class AdminController : Controller
{
    public ActionResult Setting()
    {
        throw new NotImplementedException();
    }
}

默认情况下,Action方法的方法名就是这个Action的Action名(Action名指的是Route中匹配Action方法的URL的那部分。

比如url:Home/Index。当中Index就是Action名)。

这里为什么要提到这个Action名呢?应为Action名是能够定义的。使用ActionNameAttribute来定义。

请看以下的演示样例:


public ActionResult Setting()
{
    throw new NotImplementedException();
} [ActionName("Setting")]
public ActionResult SaveSetting()
{
    throw new NotImplementedException();
}

这两个Action方法的Action名都为"Setting",即对于url:Admin/Setting ,能同一时候匹配到这两个Action方法。假设一个URL同一时候匹配到两个Action方法的话。程序会抛出一个错误:

假设我们希望这两个Action的Action名都为Setting。Setting()就用于显示一个表单页面给用户,而SaveSetting()就用于保存用户提交过来的表单数据,我们该怎么做呢?我们能够利用AcceptVerbsAttribute来设置,这个Attribute用来定义Action方法会匹配指定的HttpMethod。比如以下的代码:


[AcceptVerbs("GET")]
public ActionResult Setting()
{
    throw new NotImplementedException();
} [ActionName("Setting"), AcceptVerbs("POST")]
public ActionResult SaveSetting()
{
    throw new NotImplementedException();
}

这样,对于HttpMethod为"GET"的client请求,就会匹配到Setting()来显示一个表单给用户。假设用户POST回来的表单数据,则会匹配到SaveSetting()上面去。我们就能够处理用户POST过来的数据并保存到数据库。

在这里AcceptVerbsAttribute是继承自ActionSelectionAttribute的。我们也能够继承自ActionSelectionAttribute来自己定义自己想要实现的功能。这个我们后面会具体解说。假设你比較心急,能够看下Asp.net Mvc Preview 5 体验--实现ActionSelectionAttribute来推断是否为AJAX请求而选择不同的Action这篇文章。

假设你想将一个public的方法设置为不是Action方法,那么你就要为该public的方法加入NonAction的Attribute:

Action方法的參数

比如我们要在AdminController中定义一个编辑日志的Action方法:

public ActionResult EditPost(int? id)
{
    throw new NotImplementedException();
}

对于URL:Admin/EditPost/2 。上面的參数会自己主动被赋值为2。ASP.NET MVC在匹配Route的时候会依据Route的设置自己主动为Action方法的參数赋值。

所曾经面的id參数会被自己主动赋值为2的前提是,在Route配置的时候,必须指定了id參数。比如:

routes.MapRoute(
    "Default",                                             
// Route 的名称
    "{controller}/{action}/{id}",                          
// 带有參数的URL
    new { controller
= "Home", action
= "Index", id
= "" } 
// 设置默认的參数
);

假设我们将Route改动为:

routes.MapRoute(
    "Default",                                             
// Route 的名称
    "{controller}/{action}/{para}",                          
// 带有參数的URL
    new { controller
= "Home", action
= "Index",
para = "" } 
// 设置默认的參数
);

则前面的Action方法的參数必须改动为public ActionResult EditPost(int?
para){ },使Action方法的參数和Route中定义的參数名同样,ASP.NET MVC才干自己主动为Action方法的參数赋值。

ActionResult

Action方法返回ActionResult类型的结果。ASP.NET MVC为我们提供了几种ActionResult的实现。例如以下:

  • ViewResult. 呈现视图页给client。

    由View 方法返回.

  • RedirectToRouteResult. 重定向到另外一个Route。由RedirectToAction 和RedirectToRoute 方法返回.

  • RedirectResult. 重定向到另外一个URL。


    Redirect 方法返回.

  • ContentResult. 返回普通的内容。比如一段字符串。


    Content 方法返回.

  • JsonResult. 返回JSON结果。由
    Json 方法返回.

  • EmptyResult. 假设Action必须返回空值,能够返回这个结果。Controller中没有实现的方法。能够return new EmptyResult();.

当然我们也能够自定一个我们的ActionResult返回给client,比如一个RssResult。

能够參考Asp.Net MVC实践 - 自己定义ActionResult实现Rss输出 (基于ASP.NET MVC Preview 3)这篇文章。

通常情况下。我们的Controller可能有一些同样的情况,比如我们在各个Controller中都有可能会在出错或者什么时候想要显示一条提示信息给用户,或者有一些共同的数据要呈现的。这时候,我们最好就定义一个我们自己的Controller的基类:


public class BaseController : Controller
{
    public BaseController()
    {     }     protected ActionResult ShowMsg(List<string>
msgs)
    {
        throw new NotImplementedException();
    }     public ActionResult Message()
    {
        throw new NotImplementedException();
    }
}

然后。其它的Controller都继承自这个BaseController :


public class AdminController : BaseController
{
    [AcceptVerbs("GET")]
    public ActionResult Setting()
    {
        throw new NotImplementedException();
    }     [ActionName("Setting"), AcceptVerbs("POST")]
    public ActionResult SaveSetting()
    {
        throw new NotImplementedException();
    }     public ActionResult EditPost(int? id)
    {
        throw new NotImplementedException();
    }
}

最新文章

  1. MySQL中int类型的字段使用like查询方法
  2. Jesen不等式
  3. PL/SQL Developer连接本地64位Oracle数据库
  4. javascript 异常处理和事件处理
  5. android应用的数据应该保存到哪儿
  6. HDU 4664 Triangulation(SG函数)
  7. lipo命令
  8. 网络防火墙实战-基于pfsense(2)
  9. Papers
  10. js中对象调用对象中的方法
  11. eclipse安装svn插件,在输入url后,一直卡在in progress界面不懂。
  12. 201521123033《Java程序设计》第9周学习总结
  13. Codeforces.468C.Hack it!(构造)
  14. Centos7安装Mysql8(官方整合包)
  15. robotframework运行时后台报错UnicodeDecodeError
  16. jquery.timers使用说明
  17. Visual stuido 项目路径的奇怪问题
  18. 多线程--Java
  19. Anaconda之常用命令
  20. India and China Origins---hdu5652(二分 + bfs)或者(并查集)

热门文章

  1. stat---显示文件的状态信息
  2. rpm2cpio---如何不安装但是获取rpm包中的文件
  3. Swift学习笔记(4)--字符串及基本使用
  4. 03012_预处理对象executeQuery方法(实现数据库的查询)
  5. [Python] Python list slice syntax fun
  6. vim 基础学习之global
  7. js插件---video.js如何使用
  8. MyBatis自动生成代码之generatorConfig配置文件及其详细解读
  9. 图形界面备份Linux系统介绍
  10. C_深入(内存模型)