С# Помогите найти мое пользовательское сообщение об ошибке проверки из свойства, украшенного RequiredAttribute

[Редактировать: исходные фрагменты кода были неправильными.]

[Этот пост призван помочь ответить на конкретный вопрос, на который я нашел отличный ответ. Я ссылаюсь на свой пример сообщения, за которым я следил, а затем на сообщение, которое дало мне ответ. Затем я публикую код, который я успешно использовал для получения результатов, которых я добился.]

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

Ответ, который я нашел, чтобы направить меня к этой технике, находится здесь: https://stackoverflow.com/a/19322688/7637275

Ниже приведен мой код, с которого я начал:

using System.Web.Http;
using System.Web.Routing;
using System.Web.Http.Controllers;
using System.Web;
using System.Web.Http.Filters;

namespace TestValidation
{
    internal class ValidateModelStateFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (!actionContext.ModelState.IsValid)
            {
                throw new HttpException(422, "Validation failed on input");
            }
        }
    }
}

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

[Required(ErrorMessage = @"Parameter ""ID"" is required.")]
[MaxLength(18, ErrorMessage = @"Exceeded max length (18 characters) for parameter ""ID""")]
public string ID { get; set; }

На данный момент, в моем переопределении, мне нужно копаться в объекте HttpActionContent «actionContext», чтобы найти настроенные сообщения об ошибках.


person Rumplestiltzkin    schedule 31.05.2017    source источник


Ответы (1)


[Редактировать: исходные фрагменты кода были неправильными.]

Я нашел отличный опубликованный ответ, который помог мне решить мой вопрос! Следующая ссылка приведет вас к этому ответу: https://stackoverflow.com/a/33009722/7637275

Вот полученный код, который я использовал для предоставления настраиваемых сообщений проверки из моей веб-службы. Я сделал три небольшие корректировки. Я решил реализовать блок Try/Catch, который просто предоставляет общее сообщение об ошибке в случае сбоя кода. Я использовал список вместо var (стиль кодирования). Я также использовал точку с запятой вместо новой строки для объединения ошибок (это соответствует моему требованию).

Огромное спасибо обоим авторам в stackoverflow, которые помогли мне разобраться в этом!

using System.Web.Http;
using System.Web.Routing;
using System.Web.Http.Controllers;
using System.Web;
using System.Web.Http.Filters;
using System.Linq;
using System.Collections.Generic;


namespace TestValidation
{
    internal class ValidateModelStateFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (!actionContext.ModelState.IsValid)
            {
                string errorMessage = string.Empty;

                List<string> errors = new List<string>();

                try
                {
                    errors = actionContext.ModelState.Values.SelectMany(val => val.Errors.Select(err => err.ErrorMessage)).ToList();

                    errorMessage = string.Join(";", errors);
                }
                catch                   {
                    errorMessage = "Validation failed on input";
                }

                throw new HttpException(422, errorMessage);
            }
        }
    }
}
person Rumplestiltzkin    schedule 31.05.2017