原文: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. LA3026 - Period(KMP)

    For each prefix of a given string S with N characters (each character has an ASCII code between 97 a ...

  2. Java NIO 系列教程(转)

    原文中说了最重要的3个概念,Channel 通道Buffer 缓冲区Selector 选择器其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵塞 ...

  3. oracle db于,一个特定的数据字典pct miss其计算公式

    这篇文章是原创文章,转载请注明出处: http://blog.csdn.net/msdnchina/article/details/38766801 本文提到的数据字典.以dc_histogram_d ...

  4. 探索Windows Azure 监控和自动伸缩系列1 - 连接中国区Azure

    最近准备基于Microsoft Azure Management Libraries 实现虚拟机的监控.主要的需求就是获取虚拟机内置的性能计数器数据,基于性能计数器实现后续的监控和自动伸缩. 作为这一 ...

  5. 【Android进阶】ZXing android 错误(Could not find class 'com.google.zxing.ResultPoint)

    解决方法: 1.右键工程Build path, java build path,选择libraries 在右边的按钮中点击"Add Library" 选择"User li ...

  6. 【Java基础】“数三退一”问题的代码实现

    现在有500个小孩,编号为0-499,手牵手连成一个圈,从第一个小孩开始"123123..."报数,数到三的小孩退出,求剩下的最后一个小孩的编号. public static vo ...

  7. Redis数据结构

    Redis数据结构 Redis数据结构详解(一)   前言 Redis和Memcached最大的区别,Redis 除啦支持数据持久化之外,还支持更多的数据类型而不仅仅是简单key-value结构的数据 ...

  8. 探秘Java虚拟机——内存管理与垃圾回收(转)

    本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...

  9. FreeMarker整合Spring 3(转)

    开发环境: System:Windows WebBrowser:IE6+.Firefox3+ JavaEE Server:tomcat5.0.2.8.tomcat6 IDE:eclipse.MyEcl ...

  10. 孙陪你,了解它的权力--Kinect结合的发展Unity3D游戏应用开发

    unity3d正在使用kinect三维模型数据控制(它切成脚本) 博主在做项目时须要利用kinect数据控制三维模型中人物的动作.但不是实时控制,而是利用之前获得的骨骼数据,直接控制.无需再利用脚本打 ...