ASP.NET MVC 入门4、Controller与Action

本系列文章基于ASP.NET MVC Preview5.

Controller是MVC中比较重要的一部分。几乎所有的业务逻辑都是在这里进行处理的,并且从Model中取出数据。在ASP.NET MVC Preview5中,将原来的Controller类一分为二,分为了Controller类和ControllerBase类。Controller类继承自ControllerBase类,而ControllerBase实现是了IController接口。

image

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方法的话,程序会抛出一个错误:

image

如果我们希望这两个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:

image

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postman下载与安装操作步骤【超详细】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~&#x1f357;关注➕点赞➕评论➕收藏 &#x1f604;&#x1f64f;博主水平有限&#xff0c;如有错误&#xff0c;欢迎各位大佬纠正 Postman下载与安装&#x1…

C#异步编程模型

什么是异步编程模型 异步编程模型(Asynchronous Programming Model&#xff0c;简称APM)是C#1.1支持的一种实现异步操作的编程模型&#xff0c;虽然已经比较“古老”了&#xff0c;但是依然可以学习一下的。通过对APM的学习&#xff0c;我总结了以下三点&#xff1a; 1. APM的…

不会卸载MySQL?我连夜肝了一篇教你如何干干净净地卸载掉MySQL

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

设计模式篇

一. 什么是设计模式 纠结了好久&#xff0c;今天终于下定决心开始写设计模式系列&#xff0c;因为这个系列章节确实不好写&#xff0c;在这之前&#xff0c;也看了好多关于设计模式的博客、视频、书籍等&#xff0c;大多数用的例子要么猫啊狗啊、大雁等动物类&#xff1b;要么就…

Navicat15安装笔记

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏 &#x1f4c5;创作日期&#xff1a;2021年12月29日 &#x1f4c5;修改日期…

MySQL5安装配置笔记【超详细】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

IDEA常用快捷键大合集

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

KnockoutJs篇:快速掌握KnockoutJs

一、引言 之前这个系列文章已经介绍Bootstrap。由于最近项目中&#xff0c;前端是Asp.net MVC KnockoutJs Bootstrap来做的。所以我又重新开始写这个系列。今天就让我们来看看Web前端的MVVM框架——KnockoutJs。 二、KnockoutJs是什么&#xff1f; 做.NET开发的人应该都知道…

IDEA常用设置【很实用】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

【git下载安装与配置】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

git 连接gitee时报错 Auth error: Access deined: authorize failure

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

C#多线程编程系列(五)- 使用任务并行库

目录 1.1 简介1.2 创建任务1.3 使用任务执行基本的操作1.4 组合任务1.5 将APM模式转换为任务1.6 将EAP模式转换为任务1.7 实现取消选项1.8 处理任务中的异常1.9 并行运行任务1.10 使用TaskScheduler配置任务执行参考书籍笔者水平有限&#xff0c;如果错误欢迎各位批评指正&…

【VSCode快捷键大合集】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;欢迎&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &…

浅谈Vue.js的优势

写在前面 今天小梦跟小伙伴们简简单单聊一下Vue.js的优势。小梦也是刚刚接触Vue.js&#xff0c;在学习一门新的技术之前&#xff0c;我们当然要了解其优势&#xff0c;知道优势在哪更加有利于我们去学习并转换为自己的储备。 浅谈Vue.js的优势 首先Vue.js是一个轻巧、高性能、…

async await 的前世今生(Updated)

async 和 await 出现在C# 5.0之后&#xff0c;给并行编程带来了不少的方便&#xff0c;特别是当在MVC中的Action也变成async之后&#xff0c;有点开始什么都是async的味道了。但是这也给我们编程埋下了一些隐患&#xff0c;有时候可能会产生一些我们自己都不知道怎么产生的Bug&…

MySQL八大约束

MySQL约束MySQL约束主键约束(primary key)自增长约束(auto_increment)非空约束(not null)唯一约束(unique)默认约束(default)零填充约束(zerofill)外键约束(foreign key)MySQL约束 概念 约束英文&#xff1a;constraint约束实际上就是表中数据的限制条件 作用 表在设计的时…

ASP.NET使用管道模型(PipleLines)处理HTTP请求

大多数人认为ASP.NET仅仅只是页面——使用模板来创建HTML页面然后返回给浏览器。但是这仅仅只是ASP.NET使用HTTP管道模型处理WEB程序很小的一方面。管道模型是类似于Web Services的一种在服务器端处理ASP.NET页面的框架技术。作为一名高级的ASP.NET的开发者&#xff0c;你必须清…

【LeetCode-SQL每日一练】——1.组合两个表

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦梦梦梦。小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的。想要掌握好…

【LeetCode-SQL每日一练】——2. 第二高的薪水

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的。想要掌握好SQL&am…

【LeetCode-SQL每日一练】—— 181. 超过经理收入的员工

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的。想要掌握好SQL&am…