ASP.NET Core и ActionFilter - PullRequest
       36

ASP.NET Core и ActionFilter

0 голосов
/ 01 декабря 2018

Я перемещаю старое приложение MVC 5 в Core, старое приложение имеет код:

public class ValidateApiModelStateAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            Dictionary<string, string> result = new Dictionary<string, string>();
            foreach (var key in actionContext.ModelState.Keys)
            {
                result.Add(key, String.Join(", ", actionContext.ModelState[key].Errors.Select(p => p.ErrorMessage)));
            }
            // 422 Unprocessable Entity Explained
            actionContext.Response = actionContext.Request.CreateResponse<Dictionary<string, string>>((HttpStatusCode)422, result);
        }
    }
}

, значит, если состояние модели недействительно, мы возвращаем словарь с ошибками и кодом состояния 422 (требования клиента).

Я пытаюсь переписать его следующим образом:

[ProducesResponseType(422)]
public class ValidateApiModelStateAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            Dictionary<string, string> result = new Dictionary<string, string>();
            foreach (var key in context.ModelState.Keys)
            {
                result.Add(key, String.Join(", ", context.ModelState[key].Errors.Select(p => p.ErrorMessage)));
            }

            // 422 Unprocessable Entity Explained
            context.Result = new ActionResult<Dictionary<string, string>>(result);
        }
    }
}

, но он не может быть скомпилирован:

Невозможно неявно преобразовать тип Microsoft.AspNetCore.Mvc.ActionResult<System.Collections.Generic.Dictionary<string, string>> до Microsoft.AspNetCore.Mvc.IActionResult

как это сделать?

1 Ответ

0 голосов
/ 01 декабря 2018

Вопреки убеждению ActionResult<TValue> не является производным от IActionResult.Таким образом, ошибка.

Возврат нового ObjectResult и установка нужного кода состояния.

[ProducesResponseType(422)]
public class ValidateApiModelStateAttribute : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext context) {
        if (!context.ModelState.IsValid) {
            var result = new Dictionary<string, string>();
            foreach (var key in context.ModelState.Keys) {
                result.Add(key, String.Join(", ", context.ModelState[key].Errors.Select(p => p.ErrorMessage)));
            }

            // 422 Unprocessable Entity Explained
            context.Result = new ObjectResult(result) { StatusCode = 422 };
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...