ASP.NET MVC学习之控制器篇扩展性
一、前言
在之前的一篇随笔中已经讲述过控制器,而今天的随笔是作为之前的扩展。
二、正文
1.自定义动作方法
相信大家在开发过程一定会遇到动作方法的重名问题,虽然方法的名称和参数一样,但是里面的逻辑是不一样的,因为你设置了对应的注解属性可以确定调用哪个动作方法。这个时候你就需要将动作的名称与方法的名称区别开来,那么你就可以使用ActionName注解属性。比如我们要求一个页面在本地访问与非本地访问时呈现不同的页面,但是你又想用不同的方法区分开来写,那么这个时候你就可以使用这个注解属性了,比如下面的代码:
[ActionName("Index")]
public ActionResult LocalIndex()
{
return View();
}
public ActionResult Index()
{
return View();
}
虽然第一个方法的名称叫做LocalIndex,但是最终页面的名称还是按照ActionName中设置的名称去查询,所以读者千万不要还是按照方法的名称去新建视图,这样是错的。
2.非动作方法
从开始学到现在,大家都一定发现只要写在控制器中的公开方法最后都是一个动作方法(简单说就是对应一个页面),但是我们有时需要一个公开的方法,但是它又不是一个动作方法,仅仅只是为了便于单元测试,那么我们该怎么办?ASP.NET MVC一样还是想到了这些,为我们提供了NonAction注解属性,因为使用很简单所以就不单独举例了。
3.自定义动作方法选择器
上面的第一节介绍了动作方法可以是同一个名字,并且参数也可以完全一样,那么控制器如何去判断执行哪个动作方法呢?其中一个就是根据动作方法选择器(就是动作方法的注解属性)的返回值去过滤匹配的动作方法,ASP.NET MVC现成的有HttpPost等,当然我们也可以自定义,只要实现下面这个抽象类中的IsValidForRequest方法即可:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public abstract class ActionMethodSelectorAttribute : Attribute
{
protected ActionMethodSelectorAttribute(); public abstract bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo);
} 其中MethodInfo 中包含的关于动作方法的信息。 下面是笔者的一个示例,可以根据form表单的值决定是否执行该动作方法:
public class LoginAttribute : ActionMethodSelectorAttribute
{
bool _isFirst; public LoginAttribute(bool isFirst)
{
_isFirst = isFirst;
} public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{ string obj = controllerContext.HttpContext.Request.Form["loginType"];
if (obj != null)
{
if (_isFirst)
{
if (obj.Equals("true"))
return true;
}
else
{
if (obj.Equals("false"))
return true;
}
}
return false;
}
}
4.异步控制器
相信从事ASP.NET的人一定会知道异步这个概念,这个概念不仅仅只是在ASP.NET中即使在ASP.NET MVC中也一样存在,只是稍有变化,如果这个控制器中含有异步的方法,那么我们就需要继承AsyncController类,并且需要异步的动作方法要分成两个部分,第一个执行异步操作的方法,命名需要为 动作方法名+Async,当异步操作执行完成之后将调用 动作方法名+Completed方法,特别注意方法的规范,如果名称不对可能就无法看到异步控制器的正确执行结果,笔者有一个简单的示例:
namespace MvcStudy.Controllers
{
[SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)]
public class TestController : AsyncController
{
[NoAsyncTimeout]
public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew(() =>
{
Thread.Sleep();
AsyncManager.Parameters["data"] = "test";
AsyncManager.OutstandingOperations.Decrement();
});
}
public ActionResult IndexCompleted(string data)
{
ViewBag.Data = data;
return View();
}
}
}
这里我们使用Increment方法开启一个异步操作(该方法可以传递数字表示要开启几个异步操作),然后就是利用StartNew开始我们的一个异步操作,在异步操作完成之后将数据放入Parameters中,这样我们就可以通过IndexCompleted的参数中获得,异步操作最后调用Decrement方法标识一个异步操作完成。IndexAsync动作方法上还存在一个注解属性(NoAsyncTimeout),标识该异步操作没有超时限制,如果你需要设置一个超时可以用AsyncTimeout,并传入一个以毫秒为单位的时间,如果异步操作的执行超时则会产生TimeOutException类型的异常。
读者一定会疑惑SessionState这个注解属性是干什么的,大家一定会熟悉ASP.NET中的一般处理程序,默认都是不可以访问Session其目的就是提高性能,那么在ASP.NET MVC中我们就可以通过SessionState使该控制器不需要维护Session,当然我们也就无法在这个控制器中访问Session了,但是却可以得到性能的提升。
ASP.NET MVC学习之控制器篇扩展性的更多相关文章
- ASP.NET MVC学习之控制器篇
一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MV ...
- ASP.NET MVC学习之控制器篇(二)
原文链接:http://www.asp.net/learn/mvc/ 这篇教程探索了ASP.NET MVC控制器(controller).控制器动作(controller action)和动作结果(a ...
- ASP.NET MVC学习之过滤器篇(2)
下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...
- ASP.NET MVC学习之视图篇(2)
继ASP.NET MVC学习之视图(1)学习 4.HTML辅助器 虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用for ...
- ASP.NET MVC学习之过滤器篇(1)
一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC ...
- ASP.NET MVC学习之视图篇(1)
一.前言 不知道还有多少读者从第一篇开始一直学习到如今,笔者也会一直坚持将ASP.NET MVC的学习完美的结束掉,然后开始写如何配合其他框架使用ASP.NET MVC的随笔.当然笔者后面的随笔如果没 ...
- ASP.NET MVC学习之路由篇(3)
根据路由输出链接 既然是网站开发自然少不了链接,我们已经学会了强大的路由,但是还缺少一步就是能够将这些路由的路径输出到页面,下面我们就开始学习如何输出路由路径. 首先我们的路由注册部分如下所示: 1 ...
- ASP.NET MVC学习之路由篇(2)
7.解决与物理路径的冲突 当发送一个请求至ASP.NET MVC时,其实会检查网站中存不存在这个请求的物理路径文件,如果存在的话,就会直接将这个物理文件返回.但是有时候我们需要它执行控制器的某个方法, ...
- ASP.NET MVC学习之路由篇(1)
1.基本路由 RouteConfig.cs: 1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteColle ...
随机推荐
- 【Linux探索之旅】第一部分测试题
内容简介 1.第一部分测试题 2.第二部分第一课预告:终端Terminal,好戏上场 10道测试题 让我们选择开机时进哪个操作系统的软件叫什么? A. booter B. bootloader C. ...
- 开源NetWorkSocket通讯组件
开源NetWorkSocket通讯组件 前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经 ...
- node.js基础:模块的创建和引入
模块可能是一个文件,也可能是包含一个或多个文件的目录.如果模块是个目录,node.js通常会在这个目录下找一个叫index.js的文件作为模块的入口. 典型的模块是一个包含exports对象属性定义的 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...
- 读书笔记之SQL注入漏洞和SQL调优
原文:读书笔记之SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“' ...
- 【Java基础】常用基础--从键盘中得到一个字符串
public static void main(String[] args) { InputStreamReader ipsReader = new InputStreamReader(System. ...
- Codeforces Round #261 (Div. 2) E. Pashmak and Graph DP
http://codeforces.com/contest/459/problem/E 不明确的是我的代码为啥AC不了,我的是记录we[i]以i为结尾的点的最大权值得边,然后wa在第35 36组数据 ...
- DOM简要
在看Js视频的时候就感觉Dom这东西太奇妙了.在这个注重用户体验的Web设计时代里.Dom是至关重要的. 它的易用性强.而且遍历简单.支持XPath. 它既然这么强大那么就来简单的介绍Dom这个东东. ...
- COCOFrame
COCOFrame它是一个轻量级的开发框架,综合Android APP开发过程中经常使用的工具,方法,特效.当中F类採用的AndroidQuery实现,做了进一步的封装及部分优化. 1. Jar包大小 ...
- PAAS平台7×24小时可用性应用设计
如今非常多企业都在搭建自己的私有PAAS平台,当然也有非常多大型互联网公司搭建共同拥有PAAS平台(比如SAE/BAE/JAE(jae.jd.com)).那么使用PAAS平台来部署SAAS应用有哪些优 ...