Web API - доступ к свойствам пользовательских атрибутов внутри ActionFilterAttribute OnActionExecuting

Мне нужно получить доступ к свойству внутри пользовательского атрибута DataAnnotation. Как я могу получить доступ к этому атрибуту, чтобы установить значение ответа? Атрибут добавляется в свойство модели.

public class BirthDateAttribute : ValidationAttribute
{
    public string ErrorCode { get; set; }
    ....
}

public class ValidateModelAttribute : ActionFilterAttribute
{                
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            List<Errors> errors = new List<Errors>();

            // Set error message and errorCode
            foreach (var key in keys)
            {
                if (!actionContext.ModelState.IsValidField(key))
                {
                    error.Add(new HttpResponseError
                    {
                        Code = ???????????,
                        Message = actionContext.ModelState[key].Errors.FirstOrDefault().ErrorMessage
                    });
                }
            }                

            // Return to client
            actionContext.Response = actionContext.Request.CreateResponse(
                HttpStatusCode.BadRequest, errors);
       }
    }
}

1 ответ

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

 var att = actionContext.ControllerContext.GetType().GetCustomAttributes(typeof(BirthDateAttribute), false)[0] as BirthDateAttribute;
                string errorCode = att.ErrorCode;

Как уже упоминалось в OP, если это относится к классу (Model), это должно быть довольно просто, потому что тип уже известен. Замените класс Model.

var att = <<ModalClass>>.GetCustomAttributes(typeof(BirthDateAttribute), false)[0] as BirthDateAttribute;
                    string errorCode = att.ErrorCode;
Другие вопросы по тегам