加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用自定义ASP.NET MVC IValueProvider,而不是在

发布时间:2020-12-15 20:16:37 所属栏目:asp.Net 来源:网络整理
导读:我想要从cookie中获取键/值,并使用它来绑定模型. 而不是构建一个自定义的ModelBinder,我相信DefaultModelBinder可以很好的开箱即用,而选择值来源的最佳方式是设置它使用的IValueProvider. 为此,我不想创建自定义的ValueProviderFactory并将其全局绑定,因为我
我想要从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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读