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