ASP.NET MVC编程——控制器
每一个请求都会经过控制器处理,控制器中的每个方法被称为控制器操作,它处理具体的请求。
1操作输入参数
控制器的操作的输入参数可以是内置类型也可以是自定义类型。
2操作返回结果
|
结果类型 |
调用方法 |
备注 |
|
ContentResult |
Content |
文本类型 |
|
FileContentResult/FileStreamResult/FilePathResult |
File |
文件类型 |
|
HttpStatusCodeResult(HttpNotFoundResult,HttpUnauthorizedResult) |
HttpNotFound |
包含404,401状态码 |
|
JavaScriptResult |
JavaScript |
JavaScript代码 |
|
JsonResult |
Json |
Json字符串 |
|
PartialViewResult |
PartialView |
部分视图 |
|
RedirectResult |
Redirect/RedirectPermanent |
跳转到给定URL |
|
RedirectToRouteResult |
RedirectToAction/RedirectToRoute |
重定向到指定的路由 |
|
ViewResult |
View |
指定视图 |
|
EmptyResult |
无 |
不返回任何内容 |
上述返回值类型均继承自ActionResult,除了上述类型外,控制器可以返回任意的类型!
3 HTTP动词特性
特性有HttpGet、HttpPost、HttpDelete、HttpPut、HttpHead、HttpOptions、HttpPatch,当没有限定任何动词时,不论何种请求,get,post,put等等,被请求的操作都会被调用。
4 操作过滤器
过滤器接口有
授权过滤器:public interface IAuthorizationFilter
动作过滤器:public interface IActionFilter
身份验证过滤器:public interface IAuthenticationFilter
异常过滤器:public interface IExceptionFilter
结果过滤器:public interface IResultFilter
1)AuthorizeAttribute
public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
AuthorizeAttribute的两个常用属性
Roles:获取或设置有权访问控制器或操作方法的用户角色。
Users:获取或设置有权访问控制器或操作方法的用户。
可以在Web.config的<system.web>配置未通过验证跳转的页面:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login"></forms>
</authentication>
配合其使用的属性
AllowAnonymous
public sealed class AllowAnonymousAttribute : Attribute
允许跳过AuthorizeAttribute的验证执行控制器操作。
2)ChildActionOnlyAttribute
public sealed class ChildActionOnlyAttribute : FilterAttribute, IAuthorizationFilter
指示操作方法只能作为子操作进行调用
例:
控制器
public class HomeController : Controller
{
[ChildActionOnly]
public ActionResult TestPy()
{
return PartialView();
}
}
分部视图TestPy.cshtml:
<div>
<h1>这是部分视图</h1>
</div>
调用页Index.cshtml:
<div class="row">
<a href="@Url.Action("Home", "TestPy")">点击调用分部视图</a>
</div>
执行报错:404!
将调用页代码修改如下:
<div class="row">
@Html.Action("TestPy")
</div>
运行可以正常显示部分视图内容
3)RequireHttpsAttribute
public class RequireHttpsAttribute : FilterAttribute, IAuthorizationFilter
强制通过 HTTPS 重新发送不安全的 HTTP 请求
4)ValidateInputAttribute
public class ValidateInputAttribute : FilterAttribute, IAuthorizationFilter
验证通过窗体传进来的信息
5)ValidateAntiForgeryTokenAttribute
public sealed class ValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
阻止伪造请求
6)AsyncTimeoutAttribute
public class AsyncTimeoutAttribute : ActionFilterAttribute
设置异步操作超时时间
7)NoAsyncTimeoutAttribute
public sealed class NoAsyncTimeoutAttribute : AsyncTimeoutAttribute
设置异步操作永不超时
8)OutputCacheAttribute
public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter
将缓存其输出的操作方法
9)HandleErrorAttribute
public class HandleErrorAttribute : FilterAttribute, IExceptionFilter
处理由操作方法引发的异常
10)ActionNameAttribute
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class ActionNameAttribute : ActionNameSelectorAttribute
可以使用此特性改变操作的名称,使用新名称作为路由参数,方可路由到该操作
例:
[ActionName("AboutName")]
public ActionResult About()
{
......
}
11)NonActionAttribute
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class NonActionAttribute : ActionMethodSelectorAttribute
使用此特性修饰控制器操作,不会路由到此控制器方法
5向视图传递数据
与其说传递数据,倒不如说视图如何获得控制器处理过的数据。视图通过两种方式可以拿到数据:
1)通过控制器操作返回的结果(控制器返回结果是数据和视图的结合。
2)将结果赋给控制器属性并在View中使用这些属性。
public abstract class ControllerBase : IController
类中有三个属性ViewData、ViewBag、TempData,使用着三个属性向视图传递数据。
ViewData
它是字典类型
public ViewDataDictionary ViewData { get; set; }
public class ViewDataDictionary : IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IEnumerable
例:
第一种方式,弱类型
控制器
public ActionResult TestViewData()
{
ViewData["Field"] = "VD";
return View("Contact");
}
视图Contact.cshtml
@ViewData["Field"]
在Index.cshtml视图中调用
@Html.Action("TestViewData")
第二种方式,弱型别,使用ViewData.Model
这种方式无法使用VS编译器的智能提示功能
控制器
public ActionResult TestViewData()
{
ViewData.Model = new ModelF { Field="VD"};
return View("Contact");
}
视图Contact.cshtml
@Model.Field
在Index.cshtml视图中调用
@Html.Action("TestViewData")
第三种方式,强型别,使用ViewData.Model
控制器与第二种方式基本相同,不同点就是视图Contact.cshtml
@model MVCPointApp.Models.ModelF
@Model.Field
ViewBag
它是动态类型,对ViewData的包装
public dynamic ViewBag { get; }
例:
控制器操作中ViewBag.Field
使用@ViewBag.Message
TempData
它也是字典类型
public TempDataDictionary TempData { get; set; }
public class TempDataDictionary : IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IEnumerable
6 异步控制器
原理:
ASP.NET从线程池获得线程处理异步请求,异步调用完后,该线程回到线程池以便可以处理其他请求,同时通知ASP.NET重新抓取一个线程(不一定是处理异步请求的线程)来完成具体的异步操作(输出数据等)。
使用异步控制器的目的:
异步控制器操作中也要等待任务直至处理完,所以处理速度不比同步方法快,其主要作用是高效地利用服务器资源。
使用异步控制器的情形:
可能引发瓶颈的长操作,网络或I\O密集型操作,可取消长操作的情形。
构建异步控制器:
控制器继承AsyncController,控制器操作返回Task<ActionResult>,并用async 修饰。
public class AnysController : AsyncController
{
// GET: Anys
public async Task<ActionResult> Index()
{
//睡眠,模拟长任务
Thread.Sleep();
return View("Testpy");
}
}
7 扩展控制器
基类控制器
定义一个基类控制器,以便处理异常或无法找到请求对应的操作。
注意如果控制器使用HttpPost特性修饰,而客户端发起的是get请求,也会认为是无法找到操作。
例:
public class BaseController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
//错误日志记录
} protected override void HandleUnknownAction(string actionName)
{
//处理能找到此控制器,但找不到请求对应的操作
}
}
扩展授权过滤器(AuthorizeAttribute)
具体示例见:验证、授权与安全
动作过滤器(ActionFilterAttribute)
ActionFilterAttribute是一个抽象类,有四个方法:
操作执行后被框架自动调用的方法:OnActionExecuted
操作执行前被框架自动调用的方法:OnActionExecuting
返回结果后被框架自动调用的方法:OnResultExecuted
返回结果前被框架自动调用的方法:OnResultExecuting
参考:
1.Jess Chadwick/Todd Snyder/Hrusikesh Panda,徐雷/徐扬
译。ASP.NET MVC4 Web编程
2.Jon Galloway/Phil Haack/Brad Wilson/K. Scott Allen,孙远帅/邹权译 ASP.NET MVC4 高级编程(第四版)
3.黄保翕,ASP.NET MVC4开发指南
4.蒋金楠,ASP.NET MVC4框架揭秘
5.https://www.asp.net/mvc
-----------------------------------------------------------------------------------------
转载与引用请注明出处。
时间仓促,水平有限,如有不当之处,欢迎指正。
ASP.NET MVC编程——控制器的更多相关文章
- c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作
ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...
- ASP.NET MVC 编程参考
ASP.NET MVC 编程参考 转载请注明出处:http://surfsky.cnblogs.com MVC 参考 http://msdn.microsoft.com/zh-cn/dd40 ...
- ASP.NET MVC 5 - 控制器
MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
- .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- [转]ASP.NET MVC 5 - 控制器
MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
- .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- 二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- ASP.NET MVC编程——视图
1Razon语法 使用@符号后接C#或VB.NET语句的方式. 基本规则 1)变量 @后直接变量即可 2)代码块 为使用表达式或多行代码,@后跟大括号将多行代码包括在大括号中 3)"+&qu ...
随机推荐
- 统计表中 重复出现 XX次以上的数据
在平时使用数据库查询数据时 经常会遇到查询表中出现XX次以上的数据 以前自己遇到就直接百度 然后拿来就用 在过段时间遇到就懵逼了 还得百度.... so 还是加深理解下 省的以后遇到再次一脸 ...
- home目录迁移至新分区
在用户home目录越来越大时,就可以考虑将home目录迁移至新的分区. 1.创建新分区. fidisk /dev/sda:用磁盘管理器打开磁盘 n:新建 +10g :设置分区为10G w :保存 保存 ...
- byte[] Base64 Stream 之间相互转换
图片 base64转byte[] /// <summary> /// 保存base64图片,返回阿里云地址 /// </summary> /// <param name= ...
- 笔记︱信用风险模型(申请评分、行为评分)与数据准备(违约期限、WOE转化)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 巴塞尔协议定义了金融风险类型:市场风险.作业风 ...
- Flex弹出窗口请求Action函数
Flex弹出窗口请求Action函数 private function askQuestion(event:MouseEvent):void { var askQuestions:AskWindow ...
- Eclipse部署Java Web项目到Tomcat出错
1.今天,我打开Eclipse,准备将一个Java Web项目部署到Tomcat中, 结果弹出提示错误窗口,具体如下: (1)出错详情 Could not publish server configu ...
- 图像处理------快速均值模糊(Box Blur)
图像模糊的本质, 从数字信号处理的角度看,图像模糊就要压制高频信号保留低频信号, 压制高频的信号的一个可选择的方法就是卷积滤波.选择一个低频滤波器,对图像上的 每个像素实现低频滤波,这样整体效果就是一 ...
- 错误代码: 1045 Access denied for user 'skyusers'@'%' (using password: YES)
1. 错误描述 GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "."; 1 queries exe ...
- 手机浏览网页或打开App时莫名弹出支付宝领红包界面的原因及应对措施
自从支付宝推出扫码领红包活动后,这种模式独特的赏金机制,短时间内吸引了大量的关注,但是随之也产生了很多的问题,比由于如在赏金的驱动下,微信群里铺天盖地的红包口令,朋友圈里各式各样的领红包二维码图片, ...
- [JSOI2004]平衡点
题面在这里 题意 ...见链接吧 sol 在此发一篇模拟退火的题解 不得不说luogu的数据真是太良心啦 一句话解释模拟退火:在一个慢慢缩小的范围内随机状态寻找最优解,当转移状态更优时直接接受,当当前 ...