扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“ASP.NET的AsyncState参数的作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联-成都网站建设公司,专注成都网站建设、网站建设、网站营销推广,域名注册,网站空间,网站托管维护有关企业网站制作方案、改版、费用等问题,请联系创新互联。
ASP.NET的AsyncState参数
这是因为默认的Model Binder无法得知如何从一个上下文环境中得到一个AsyncCallback对象。这一点倒非常简单,我们只需要构造一个AsyncCallbackModelBinder,而它的BindModel方法仅仅是将AsyncMvcHandler.BeginProcessRequest方法中保存的AsyncCallback对象取出并返回:
public sealed class AsyncCallbackModelBinder : IModelBinder { public object BindModel( ControllerContext controllerContext, ModelBindingContext bindingContext) { return controllerContext.Controller.GetAsyncCallback(); } }
其使用方式,便是在应用程序启动时将其注册为AsyncCallback类型的默认Binder:
protected void Application_Start() { RegisterRoutes(RouteTable.Routes); ModelBinders.Binders[typeof(AsyncCallback)] = new AsyncCallbackModelBinder(); }
对于AsyncState参数您也可以使用类似的做法,不过这似乎有些不妥,因为object类型实在过于宽泛,并不能明确代指AsyncState参数。事实上,即使您不为asyncState设置binder也没有太大问题,因为对于一个异步ASP.NET请求来说,其AsyncState永远是null。如果您一定要指定一个binder,我建议您在每个Action方法的asyncState参数上标记如下的Attribute,它和AsyncStateModelBinder也已经被一并建入项目中了:
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] public sealed class AsyncStateAttribute : CustomModelBinderAttribute { private static AsyncStateModelBinder s_modelBinder = new AsyncStateModelBinder(); public override IModelBinder GetBinder() { return s_modelBinder; } }
使用方式如下:
[AsyncAction] public ActionResult AsyncAction(AsyncCallback cb, [AsyncState]object state) { ... }
其实,基于Controller的扩展方法GetAsyncCallback和GetAsyncState均为公有方法,您也可以让Action方法不接受这两个参数而直接从Controller中获取——当然这种做法降低了可测试性,不值得提倡。
“ASP.NET的AsyncState参数的作用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流