asp.net-mvc – 使用自定义ASP.NET MVC IValueProvider,而不是在
我想要从cookie中获取键/值,并使用它来绑定模型.
而不是构建一个自定义的ModelBinder,我相信DefaultModelBinder可以很好的开箱即用,而选择值来源的最佳方式是设置它使用的IValueProvider. 为此,我不想创建自定义的ValueProviderFactory并将其全局绑定,因为我只希望在特定的操作方法中使用该ValueProvider. 我已经建立了一个这样做的属性: /// <summary> /// Replaces the current value provider with the specified value provider /// </summary> [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class,Inherited = true,AllowMultiple = true)] public class SetValueProviderAttribute : ActionFilterAttribute { public SetValueProviderAttribute(Type valueProviderType) { if (valueProviderType.GetInterface(typeof(IValueProvider).Name) == null) throw new ArgumentException("Type " + valueProviderType + " must implement interface IValueProvider.","valueProviderType"); _ValueProviderType = valueProviderType; } private Type _ValueProviderType; public override void OnActionExecuting(ActionExecutingContext filterContext) { IValueProvider valueProviderToAdd = GetValueProviderToAdd(); filterContext.Controller.ValueProvider = valueProviderToAdd; } private IValueProvider GetValueProviderToAdd() { return (IValueProvider)Activator.CreateInstance(_ValueProviderType); } } 不幸的是,ModelBinder及其IValueProvider设置为在OnActionExecuting之前(为什么).有没有其他人想出一种方法来注入一个自定义的IValueProvider到DefaultModelBinder而不使用ValueProviderFactory? 解决方法
在这种情况下,您仍然应该使用ValueProviderFactory.
您必须在ValueProviderFactory上实现的方法具有此签名: IValueProvider GetValueProvider(ControllerContext controllerContext) 在该方法的实现中,您可以检查控制器上下文,如果传入请求是要用于控制器/操作的Cookie,则返回一些CustomCookieValueProvider. 如果您不想利用Cookie的请求,只需返回null,框架将从值提供程序列表中过滤出来. 作为奖励,您可能不想硬编码何时将CustomCookieValueProvider用于ValueProviderFactory中的逻辑.您也许可以利用DataTokens来匹配什么时候使用Cookie和给定的路由.所以添加一个这样的路由: routes.MapRoute("SomeRoute","{controller}/{action}").DataTokens.Add("UseCookies",true); 注意在那里的DataTokens.Add()调用,现在在你的GetValueProvider方法你可以做这样的事情: if (controllerContext.RouteData.DataTokens.ContainsKey("UseCookies")) { return new CustomCookieValueProvider(controllerContext.RequestContext.HttpContext.Request.Cookies); } return null; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何将环境变量放在web.config中?
- asp.net – Azure可以运行WPF吗?
- 常用正则表达式
- asp.net-mvc-3 – 获取行中的第一个和第二个td元素
- asp.net-core – SignalR Authorize属性不适用于cookie身份
- asp.net-mvc – 如何使用ASP.NET MVC在我的现有数据库中设置
- asp.net-mvc – 设置MVC 3 rc1 Razor cshtml文件构建动作编
- 保持ASP.Net Session活跃的最佳方法
- asp.net – DotNetOpenAuth收到电子邮件
- IIS ASP.NET WebApi在请求同一台服务器时死锁
- asp.net – 在同一个项目的MVC和Web API中使用In
- asp.net – Session实际上如何在MVC中运行?
- js_ajax模拟form表单提交_多文件上传_支持单个删
- ASP.NET平台有相当于Heroku吗?
- 如何将asp.net的后台cs代码移动到页面上
- ASP.NET有一个复选框列表,在4×5网格中有我很好的
- asp.net – 如何从vb.net中的日期时间中提取日期
- asp.net-mvc – 多个DbContext,多个Database.Set
- asp.net-mvc – MVC中的SignalR偏移Application
- asp.net – 设置Response.Status生成“HTTP状态字