Как получить атрибуты параметра, который я пытаюсь привязать в IModelBinder? - PullRequest
3 голосов
/ 28 ноября 2011

Есть ли способ доступа к атрибутам параметра действия контроллера, который в настоящее время обрабатывается из IModelBinder.BindModel()?

В частности, я пишу связыватель для привязки данных запроса к произвольному типу Enum(указывается в качестве параметра шаблона для подшивки модели), и я хотел бы указать для каждого параметра действия контроллера, для которого я хочу использовать эту подшивку, имя значения HTTP-запроса для получения значений Enum из.

Пример:

public ViewResult ListProjects([ParseFrom("jobListFilter")] JobListFilter filter)
{
    ...
}

и связыватель модели:

public class EnumBinder<T>  : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,
                            ModelBindingContext bindingContext)
    {
        HttpRequestBase request = controllerContext.HttpContext.Request;

        // Get the ParseFrom attribute of the action method parameter
        // From the attribute, get the FORM field name to be parsed
        //
        string formField = GetFormFieldNameToBeParsed();

        return ConvertToEnum<T>(ReadValue(formField));
    }
}

Я подозреваю, что в рабочем процессе запроса может быть другая, более подходящая точка, в которой я бы указал значение атрибута.

1 Ответ

2 голосов
/ 28 ноября 2011

Узнайте, как это сделать, используя класс CustomModelBinderAttribute:

public class EnumModelBinderAttribute : CustomModelBinderAttribute
{
    public string Source { get; set; }
    public Type EnumType { get; set; }

    public override IModelBinder GetBinder()
    {
        Type genericBinderType = typeof(EnumBinder<>);
        Type binderType = genericBinderType.MakeGenericType(EnumType);

        return (IModelBinder) Activator.CreateInstance(binderType, this.Source);
    }
}

Теперь метод действия выглядит так:

public ViewResult ListProjects([EnumModelBinder(EnumType=typeof(JobListFilter), Source="formFieldName")] JobListFilter filter)
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...