app.UseStatusCodePagesWithReExecute("/Error/{0}");
在我的控制器中,我指向两个视图中的一个,一个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
发布于 2019-01-11 08:24:28
正如@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/questions/54125264
复制