Я хочу иметь возможность получать ключи/значения из 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?