» » Избавляемся от boilerplate для валидации в ASP.NET MVC

 

Избавляемся от boilerplate для валидации в ASP.NET MVC

Автор: admin от 9-01-2018, 17:50, посмотрело: 40

В большинстве примеров проверка входных данных ASP.NET MVC осуществляется следующим образом:



        [HttpPost]
        public IActionResult Test(SomeParam param)
        {
            if (!ModelState.IsValid)
            {
                return View(param);
                // return Json({success: false, state: ModelState});
            }
            
            dbContext.UpdateData(param);

            return RedirectToAction("index");
            // return Ok({success: true});
        }


Этот код можно улучшить:




  1. вынести валидацию из тела метода и избавиться от дублирования if (!ModelState.IsValid)

  2. вернуть код ответа 422

stackoverflow обсуждался вопрос «какой код возвращать при ошибке валидации». Семейство 4** выглядит наиболее подходящим. 422 — уже используется Ruby из коробки. ASP.NET MVC не предлагает best practice на этот счет. Не вижу причин не привести в соответствие с Ruby:



    internal class ValidationFailedResult: JsonResult
    {
        public ValidationFailedResult(ModelStateDictionary modelState)
            : base(modelState.Select(x => new
                {
                    x.Key,
                    ValidationState = x.Value.ValidationState.ToString(),
                    x.Value.Errors
                }).ToList())        
        {
        }

        public override void ExecuteResult(ActionContext context)
        {
            base.ExecuteResult(context);
            SetStatusCodeAndHeaders(context.HttpContext);
        }

        internal static void SetStatusCodeAndHeaders(HttpContext context)
        {
            context.Response.StatusCode = 422;
            context.Response.Headers.Add("X-Status-Reason", "Validation failed");
        }
    }


Используем атрибут



ValidationFilterAttribute можно использовать на




  • методе контроллера

  • контроллере

  • глобально



  • Остается только разделить контроллеры, возвращающие View от Json. Этого можно добиться, создав два базовых класса или добавив соглашение в аттрибут, например проверять наличие api в namespace контроллера.



    Примеры кода приведены для ASP.NET MVC Core. Для ASP.NET MVC придется создать два набора аттрибутов для пространства имен Mvc и Http, соответственно.


    Источник: Хабрахабр

    Категория: Программирование

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

    Добавление комментария

    Имя:*
    E-Mail:
    Комментарий:
    Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
    Введите два слова, показанных на изображении: *