Использовать пользовательский 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?

12
задан nikmd23 7 October 2011 в 21:37
поделиться