[转]ASP.NET MVC 入门4、Controller与Action

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"的客户端请求,就会匹配到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. 呈现视图页给客户端。由View 方法返回.
  • RedirectToRouteResult. 重定向到另外一个Route。由RedirectToAction 和RedirectToRoute 方法返回.
  • RedirectResult. 重定向到另外一个URL。由 Redirect 方法返回.
  • ContentResult. 返回普通的内容。例如一段字符串。由 Content 方法返回.
  • JsonResult. 返回JSON结果。由 Json 方法返回.
  • EmptyResult. 如果Action必须返回空值,可以返回这个结果。Controller中没有实现的方法,可以return new EmptyResult();.

当然我们也可以自定一个我们的ActionResult返回给客户端,例如一个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();
    }
}

好,时间不早了,就先到这里吧。Enjoy!Post by Q.Lee.lulu

时间: 2024-11-05 15:59:26

[转]ASP.NET MVC 入门4、Controller与Action的相关文章

ASP.NET mvc下在Controller下action的跳转方式

在ASP.NET mvc下,action有多种挑战方式: return RedirectToAction("Index");//一个参数时在本Controller下 如果RedirectToAction(ActionName,ControllerName) //可以直接跳到别的Controller. return RedirectToRoute(new {controller="Home",action="Index"});//可跳到其他cont

ASP.NET MVC 入门4、Controller与Action

原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303672.html Controller是MVC中比较重要的一部分.几乎所有的业务逻辑都是在这里进行处理的,并且从Model中取出数据.在ASP.NET MVC Preview5中,将原来的Controller类一分为二,分为了Controller类和ControllerBase类.Controller类继承自ControllerBase类,而ControllerBase实现是了

26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展

本系列目录:ASP.NET MVC4入门到精通系列目录汇总 有好一段时间没更新博文了,最近在忙两件事:1.看书,学习中...2.为公司年会节目做准备,由于许久没有练习双截棍了,难免生疏,所以现在临时抱佛脚.深圳最近的天气反常,许多人感冒了,我也成为其中之一,大家注意身体... 这一篇,我来简单的讲一下接下来项目中会用到的一些杂七杂八的技术. 区域及分离 在15.ASP.NET MVC入门到精通——MVC-路由中,我已经简要说明了区域的分离. 1.右键单击Web项目,“添加”——“区域”,区域名,

Asp.net MVC入门视频教程

编程开发 > Asp.net视频教程 > Asp.net MVC入门视频教程 > 1.传统web处理方式和mvc处理方式 上传日期:2014-08-16 10:02:45  相关摘要:  - 怎么一创建传统补间就成了上下移动的了 - web 服务器 第一次进入站点速度慢是什么问题?? - EF中怎么处理像Sql多表连接的问题? 2.mvc项目会自动导入mvc程序集 上传日期:2014-08-16 10:14:51  相关摘要:  - Asp.net mvc 可以不用js吗 - 项目发布的

ASP.NET MVC 入门1、简介

什么是MVC模式 MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式.它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller). 那么MVC模式和我们熟悉的WebForm模式有什么不同呢?他的各个部分又是怎样分工的呢? 我们先来看一下普通的WebForm模式下,我们请求一个例如http://www.51mvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻

ASP.NET MVC 入门系列教程

ASP.NET MVC 入门1.简介 ASP.NET MVC 入门2.项目的目录结构与核心的DLL ASP.NET MVC 入门3.Routing ASP.NET MVC 入门4.Controller与Action ASP.NET MVC 入门5.View与ViewData ASP.NET MVC 入门6.TempData ASP.NET MVC 入门7.Hellper与数据的提交与绑定 ASP.NET MVC 入门8.ModelState与数据验证 ASP.NET MVC 入门9.Action

ASP.NET MVC 入门2、项目的目录结构与核心的DLL

原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303521.html 我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据. Content :这个目录是建议用来存放一下资源文件的.例如CSS.JS.图片等等.当然你不愿意的话,完全可以不放到这里来. Controllers :这个目录

ASP.NET MVC 入门3、Routing

原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303612.html 在一个route中,通过在大括号中放一个占位符来定义( { and } ).当解析URL的时候,符号"/"和"."被作为一个定义符来解析,而定义符之间的值则匹配到占位符中.route定义中不在大括号中的信息则作为常量值. 下面是一些示例URL: Valid route definitions Examples of matchin

ASP.NET MVC 入门5、View与ViewData

View建立时有MVC View Page 和 MVC View Content Page两种类型, 前者为标准View, 后者为可继承Master母版页的View. Asp.Net MVC 默认使用WebForm作为View的, 继承关系 View->ViewPage->Page & IViewDataContainer, IViewDataContainer提供了AjaxHelper/HtmlHelper/UrlHelper实例和一系列接口定义. Controller通过ViewD

ASP.NET MVC 入门6、TempData

原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303948.html ASP.NET MVC的TempData用于传输一些临时的数据,例如在各个控制器Action间传递临时的数据或者给View传递一些临时的数据,相信大家都看过"在ASP.NET页面间传值的方法有哪几种"这个面试题,在ASP.NET MVC中TempData的就是其中的一种传值方法.TempData默认是使用Session来存储临时数据的,TempDat