ASP.NET MVC ActionFilterAttribute вставляет значение перед привязкой модели - PullRequest
6 голосов
/ 24 ноября 2010

Я хотел бы создать атрибут фильтра настраиваемого действия, который добавляет значение в элементы HttpContext, которое будет доступно при привязке модели.

Я пытался добавить его в OnActionExecuting, но кажется, что привязка модели выполняется перед фильтром.

Ты хоть представляешь, как я мог это сделать? Возможно, в связывателе моделей есть метод, который я мог бы переопределить, который будет запущен после фильтра и использовать значение, введенное моим фильтром.

Что я хочу сделать, это добавить контекст проверки (библиотека, которую я использую для проверки, поддерживает контекст, это nvalid.net (www.nvalid.net)

Я хотел бы иметь возможность разместить такой атрибут, как

[ValidationContext("Prevalidation")]

в моем методе actionresult, чтобы проверка, выполняемая в моем связывателе пользовательской модели, могла знать, какой контекст использовать при выполнении проверки.

Вот почему я не могу просто сделать специальную модель для переплета.

Ответы [ 3 ]

4 голосов
/ 25 ноября 2010

Я нашел способ достичь этого.

public class ModelBinder : DefaultModelBinder
{
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var actionName = controllerContext.RouteData.Values["action"] != null
                                 ? controllerContext.RouteData.Values["action"].ToString()
                                 : string.Empty;

        var attribute = controllerContext.Controller.GetType().GetMethods()
            .Where(x => x.Name == actionName)
            .Where(x => x.GetCustomAttributes(false).Any(a => a.GetType() == typeof(CustomActionFilterAttribute)))
            .Select(x => x.GetCustomAttributes(typeof(CustomActionFilterAttribute), false).FirstOrDefault())
            .FirstOrDefault() as CustomActionFilterAttribute;

        if(attribute != null && attribute.AnyProperty)
        {
            // Do what you want
        }
    }
}

Поразмыслив, я могу найти атрибут и использовать его в моем связывателе моделей

3 голосов
/ 24 ноября 2010

Почему бы просто не написать пользовательский механизм связывания моделей и не использовать метод BindModel ?

0 голосов
/ 15 января 2019

Я слишком поздно с моим ответом, но вы можете использовать

AuthorizationFilterAttribute

Это выполняется до ModelBinders.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...