而不是构建一个自定义的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上实现的方法具有此签名:
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;
原文地址:https://www.jb51.cc/aspnet/246107.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。