Использование UseStatusCodePagesWithReExecute с сообщением, не работающим должным образом - PullRequest
0 голосов
/ 10 января 2019

Я использую UseStatusCodePagesWithReExecute в моем веб-приложении .NET Core 2.1 следующим образом

app.UseStatusCodePagesWithReExecute("/Error/{0}");

и в моем контроллере я указываю на 1 из 2 представлений, представление 404.cshtml и общее представление error.cshtml

public class ErrorController : Controller
{
    [HttpGet("[controller]/{statusCode:int}")]
    public IActionResult Error(int? statusCode = null)
    {
        if (statusCode.HasValue)
        {
            if (statusCode == (int)HttpStatusCode.NotFound)
            {
                return View(statusCode.ToString());
            }
        }

        return View();
    }
}

Теперь в моем контроллере страниц я могу сделать следующее, и все работает как положено. Это покажет error.cshtml

public IActionResult SomePage()
{
    return BadRequest();
}

Теперь, если я изменю вышеприведенное на следующее, мой ErrorController действительно попадет, но к тому времени, когда в браузере загрузится пустое представление, показывающее только «Некоторые детали».

public IActionResult SomePage()
{
    return BadRequest("Some details");
}

Есть идеи, почему? Я хочу, чтобы он загрузил error.cshtml

1 Ответ

0 голосов
/ 11 января 2019

Как сказал @Kirk Larkin, промежуточное ПО UseStatusCodePagesWithReExecute не будет работать, и оно будет обрабатывать только код состояния.

Вы можете использовать фильтры результатов, чтобы написать свою собственную логику, чтобы отфильтровать ее и вернуть ViewResult:

public class StatusCodeResultFilter : IAsyncResultFilter
{
    public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
    {
        // retrieve a typed controller, so we can reuse its data
        if (context.Controller is Controller controller)
        {
            // intercept the NotFoundObjectResult
            if (context.Result is BadRequestObjectResult badRequestObject)
            {
                // set the model, or other view data
                controller.ViewData.Model = badRequestObject.Value;

                // replace the result by a view result
                context.Result = new ViewResult()
                {
                    StatusCode = 400,
                    ViewName = "Views/Error/status400.cshtml",
                    ViewData = controller.ViewData,
                    TempData = controller.TempData,

                };
            }

        }

        await next();
    }
}

Зарегистрировать фильтр:

 services.AddMvc(config =>
        {
            config.Filters.Add(new StatusCodeResultFilter());

        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

По вашему мнению, вы можете напрямую получить подробное сообщение по:

@Model

Ссылка: https://stackoverflow.com/a/51800917/5751404

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...