PageResult всегда возвращает нуль в IAsyncPageFilter - OnPageHandlerExecutionAsync в Asp.Net Core 2.0 Razor Pages - PullRequest
0 голосов
/ 31 декабря 2018

Я использую ModelValidationFilter для обработки ошибок проверки модели для всех моих постов или запросов на размещение.Я использую IAsyncPageFilter и регистрируюсь как глобальный фильтр.В методе OnPageHandlerExecutionAsync я могу обрабатывать ошибки проверки для запросов ajax и отправлять обратно ответ json.Но для не AJAX-запроса,

Я получаю всегда ноль для var result = (PageResult) context.Result;

Не могли бы вы помочь мне в этом?

Я реализую это так, что мне не нужно писать валидацию модели во всех постах или помещать обработчики на любую страницу бритвы в моем приложении.

Вот моя реализация:

if (context.HttpContext.Request.Method.Equals("POST") || context.HttpContext.Request.Method.Equals("PUT"))
{
    if (!context.ModelState.IsValid)
    {
        if (context.HttpContext.Request.IsAjaxRequest())
        {
            var errorModel = context.ModelState.Keys.Where(x => context.ModelState[x].Errors.Count > 0)
                .Select(x => new
                {
                    key = x,
                    errors = context.ModelState[x].Errors.Select(y => y.ErrorMessage).ToArray()
                });

            context.Result = new JsonResult(new AjaxResultHelper<IEnumerable<object>>
            {
                Response = errorModel,
                Message = "_InvalidData_"
            });
        }
        else
        {
            var result = (PageResult)context.Result;

            context.Result = new PageResult
            {
                ViewData = result.ViewData,
                ContentType = result.ContentType,
                StatusCode = 400,
            };
        }
    }
}
else
{
    await next.Invoke();
}

1 Ответ

0 голосов
/ 23 мая 2019

В соответствии с документацией

OnPageHandlerExecutionAsync : вызывается асинхронно до вызова метода-обработчика после завершения привязки модели.

Это означает, что у вас нет Result , доступного до тех пор, пока не будут вызваны обработчики OnGet / OnPost.Что вам нужно сделать, это получить базовый HandlerInstance из контекста и преобразовать его в PageModel.Теперь вы сможете получить доступ к ViewData и ContentType.

. Затем создайте свой PageResult, как показано ниже:

var result = context.HandlerInstance as PageModel;
context.Result = new PageResult
{
    ViewData = result.ViewData,
    ContentType = result.Request.ContentType,
    StatusCode = 400,
};

Возможно, верните BadRequestObjectResult, если ModelState недействительно.

if (context.HandlerInstance is PageModel result) //using pattern matching
{
    result.Response.StatusCode = 400;
    context.Result = result.Page();
}

await Task.CompletedTask;

Причина, по которой вы получили ошибку site can't be reached, так как при создании * 1034 не было заданной страницы.Вместо этого вы можете установить Response.StatusCode = 400, а затем вызвать result.Page(), который вернет PageResult.Я проверил приведенный выше код, и он работает.Надеюсь, это поможет.

...