原文: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学习之控制器篇扩展性的更多相关文章

  1. ASP.NET MVC学习之控制器篇

    一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MV ...

  2. ASP.NET MVC学习之控制器篇(二)

    原文链接:http://www.asp.net/learn/mvc/ 这篇教程探索了ASP.NET MVC控制器(controller).控制器动作(controller action)和动作结果(a ...

  3. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  4. ASP.NET MVC学习之视图篇(2)

    继ASP.NET MVC学习之视图(1)学习 4.HTML辅助器 虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用for ...

  5. ASP.NET MVC学习之过滤器篇(1)

    一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC ...

  6. ASP.NET MVC学习之视图篇(1)

    一.前言 不知道还有多少读者从第一篇开始一直学习到如今,笔者也会一直坚持将ASP.NET MVC的学习完美的结束掉,然后开始写如何配合其他框架使用ASP.NET MVC的随笔.当然笔者后面的随笔如果没 ...

  7. ASP.NET MVC学习之路由篇(3)

    根据路由输出链接 既然是网站开发自然少不了链接,我们已经学会了强大的路由,但是还缺少一步就是能够将这些路由的路径输出到页面,下面我们就开始学习如何输出路由路径. 首先我们的路由注册部分如下所示: 1 ...

  8. ASP.NET MVC学习之路由篇(2)

    7.解决与物理路径的冲突 当发送一个请求至ASP.NET MVC时,其实会检查网站中存不存在这个请求的物理路径文件,如果存在的话,就会直接将这个物理文件返回.但是有时候我们需要它执行控制器的某个方法, ...

  9. ASP.NET MVC学习之路由篇(1)

    1.基本路由 RouteConfig.cs: 1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteColle ...

随机推荐

  1. 安全扫描工具-AppScan

    AppScan主要作用是对页面进行安全扫描的工具

  2. 如何使用junit4写单元测试用例(转)

    JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写. 先 简单解释一下什么是Annotation,这个单词一般是翻译成元数据.元数 ...

  3. C++ primer札记10-继承

    包.继承,多态性C++的三个基本概念,在这里,我们重点总结继承的东西 1 类派生列表 类派生列表中指定一个派生类继承基类,来自列表与一个或多个基类如: class B : public A1,prot ...

  4. toString()和String.valueof()比较

     toString()和String.valueof()比较 做项目时常常会用到类型转换,比较常用的是toString(),但其实还是用String.valueof()比较好.看源码后他们的区别就更加 ...

  5. 2.Cocos2dx 3.2重力系统Box2D

     1 加入Box2D相关的库 步骤1:右击项目所在的解决方式à加入->现有项目àE:\Installed\cocos2d-x-3.2\cocos2d-x-3.2\external\Box2D ...

  6. redis基础的字符串类型

    redis —— 第二篇 基础的字符串类型 我们都知道redis是采用C语言开发,那么在C语言中表示string都是采用char[]数组的,然后你可能会想,那还不简单,当我执行如下命令,肯定是直 接塞 ...

  7. C#枚举数和迭代器

    大道至简,始终认为简洁是一门优秀的编程语言的一个必要条件.相对来说,C#是比较简洁的,也越来越简洁.在C#中,一个关键字或者语法糖在编译器层面为我们做了很多乏味的工作,可能实现的是一个设计模式,甚至是 ...

  8. SqlServer 添加列并赋值

    有个需求,需要给某张表添加一列并且赋值,分解需求,一共分两部走: 添加列 赋值 两个功能都不难,很快实现. --add column alter table Med_Summary_Template ...

  9. structs2注解+jsp+ajax实现post异步载入select

    流程: 1.点击载入btn发起异步请求post 2.后台处理请求返回数据 3.前端获取数据成功,对数据进行处理 前端: html:首先要导入jq包,不然怎么用ajax呢. <script typ ...

  10. Net 项目构建基于Jenkins + Github + Mono 的持续集成环境

    Net 项目构建基于Jenkins + Github + Mono 的持续集成环境 阅读目录 1 安装 2 配置 3 测试 在Redhat enterprise 6.5 的服务器上,为在gutub 上 ...