ASP.NET的AsyncState参数

开发 后端
本文介绍ASP.NET的AsyncState参数,以及介绍默认的Model Binder无法得知如何从一个上下文环境中得到一个AsyncCallback对象。

ASP.NET的AsyncState参数

这是因为默认的Model Binder无法得知如何从一个上下文环境中得到一个AsyncCallback对象。这一点倒非常简单,我们只需要构造一个AsyncCallbackModelBinder,而它的BindModel方法仅仅是将AsyncMvcHandler.BeginProcessRequest方法中保存的AsyncCallback对象取出并返回:

  1. public sealed class AsyncCallbackModelBinder : IModelBinder  
  2. {  
  3.     public object BindModel(  
  4.         ControllerContext controllerContext,  
  5.         ModelBindingContext bindingContext)  
  6.     {  
  7.         return controllerContext.Controller.GetAsyncCallback();  
  8.     }  


其使用方式,便是在应用程序启动时将其注册为AsyncCallback类型的默认Binder:

 

  1. protected void Application_Start()  
  2. {  
  3.     RegisterRoutes(RouteTable.Routes);  
  4.     ModelBinders.Binders[typeof(AsyncCallback)] = new AsyncCallbackModelBinder();  


对于AsyncState参数您也可以使用类似的做法,不过这似乎有些不妥,因为object类型实在过于宽泛,并不能明确代指AsyncState参数。事实上,即使您不为asyncState设置binder也没有太大问题,因为对于一个异步ASP.NET请求来说,其AsyncState永远是null。如果您一定要指定一个binder,我建议您在每个Action方法的asyncState参数上标记如下的Attribute,它和AsyncStateModelBinder也已经被一并建入项目中了:

 

  1. [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = falseInherited = false)]  
  2. public sealed class AsyncStateAttribute : CustomModelBinderAttribute  
  3. {  
  4.     private static AsyncStateModelBinder s_modelBinder = new AsyncStateModelBinder();  
  5.  
  6.     public override IModelBinder GetBinder()  
  7.     {  
  8.         return s_modelBinder;  
  9.     }  


使用方式如下:

 

  1. [AsyncAction]  
  2. public ActionResult AsyncAction(AsyncCallback cb, [AsyncState]object state) { ... } 


其实,基于Controller的扩展方法GetAsyncCallback和GetAsyncState均为公有方法,您也可以让Action方法不接受这两个参数而直接从Controller中获取——当然这种做法降低了可测试性,不值得提倡。以上介绍ASP.NET的AsyncState参数

【编辑推荐】

  1. 介绍ASP.NET 2.0虚拟主机
  2. 浅谈ASP.NET应用程序
  3. 优化ASP.NET 2.0 Profile Provider
  4. 浅谈ASP.NET管道优化
  5. 介绍ASP.NET Routing引擎
责任编辑:佚名 来源: IT168
相关推荐

2009-07-22 17:45:35

ASP.NET教程

2009-07-28 17:17:19

ASP.NET概述

2009-08-03 14:22:33

什么是ASP.NET

2009-07-27 12:22:03

ASP.NET和ASPASP.NET入门教程

2009-07-27 15:48:43

2009-07-29 11:19:03

JavaScriptASP.NET

2009-07-29 14:52:12

IScriptContASP.NET

2009-07-29 16:33:28

GreeterLogiASP.NET

2009-07-27 10:35:33

TypeConvertASP.NET

2009-12-30 17:51:31

Silverlight

2009-08-10 13:32:15

ASP.NET TimASP.NET组件设计

2009-07-29 17:11:25

ASP.NET ISA

2009-07-29 16:08:07

ASP和ASP.NET

2009-07-22 18:03:00

ASP.NET ASP

2009-07-29 17:29:46

ASP与ASP.NET

2011-09-22 10:58:56

ASP.NET

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功

2009-08-03 13:38:18

ASP.NET编程模型

2009-08-03 17:35:07

ASP.NET WebASP.NET编程工具

2009-07-28 09:02:32

asp.net aja
点赞
收藏

51CTO技术栈公众号