从asp.net核心中的中间件返回现有razor视图
在我的自定义异常中间件中,我希望处理异常,并使用用户友好的消息返回相同的资源 例如,当从asp.net核心中的中间件返回现有razor视图,razor,asp.net-core-mvc,asp.net-core-2.1,Razor,Asp.net Core Mvc,Asp.net Core 2.1,在我的自定义异常中间件中,我希望处理异常,并使用用户友好的消息返回相同的资源 例如,当Account/Add抛出SqlException时,我返回Account/Add响应,并从异常中间件返回一条存储在TempData中的消息。我已经 完成了这些视图引擎的工作 我找到了用于此目的的扩展方法和用法,有了它,您可以从中间件返回所有IActionResult实现,非常好的扩展。 但是,我无法找到如何返回驻留在我的视图文件夹中的常规视图,例如views/Account/Add 异常中间件 private
Account/Add
抛出SqlException
时,我返回Account/Add
响应,并从异常中间件返回一条存储在TempData
中的消息。我已经
完成了这些视图引擎的工作
我找到了用于此目的的扩展方法和用法,有了它,您可以从中间件返回所有IActionResult
实现,非常好的扩展。
但是,我无法找到如何返回驻留在我的视图文件夹中的常规视图,例如views/Account/Add
异常中间件
private readonly RequestDelegate _next;
public ExceptionHandler(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (Exception ex)
{
HandleException(context, ex);
}
}
private void HandleException(HttpContext context, Exception exception)
{
//handle exception, log it and other stuff...
//....
var result = new ViewResult
{
ViewName = context.Request.Path.ToString(),
};
//WithDanger is an extension method writes message to tempdata
result.WithDanger("Error", exception.ToString());
//Extension method
context.WriteResultAsync(result);
}
这是我尝试过的,但它没有像我预期的那样工作,它返回一个空白页面,似乎它没有使razor视图引擎运行来构建我的请求页面
我如何使我的中间件正确地返回带有现有视图的
ViewResult
。要使用相对路径返回视图,需要修剪前导斜杠:
ViewName = context.Request.Path.ToString().TrimStart('/')
您也没有等待WriteResultAsync
调用。把它改成
private TaskHandleException(HttpContext context, Exception exception)
{
//handle exception, log it and other stuff...
//....
var result = new ViewResult
{
ViewName = context.Request.Path.ToString().TrimStart('/'),
};
//WithDanger is an extension method writes message to tempdata
result.WithDanger("Error", exception.ToString());
//Extension method
return context.WriteResultAsync(result);
}
并确保等待调用HandleException
:
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (Exception ex)
{
await HandleException(context, ex);
}
}
这应该有用:)谢谢你,克里斯蒂安,这是我的错误,我已经放弃了更改签名。:)但是,现在,我遇到了一个路由错误,路由在
视图/Home/Home/ThrowErr
中搜索我的视图,而不是视图/Home/ThrowErr
。我有一个测试动作Home/ThrowErr
,只是有条件地抛出错误。(第一个req抛出错误,第二个返回视图,用于测试目的)。我只有默认的mvc路由。我应该使用另一个路径吗?我尝试在Views/Account
中添加一个名为Add.cshtml
的视图。当我转到/Account/Add
并抛出异常时,我得到了视图服务。我不确定是什么原因导致它出现在视图/Home/Home
中。请注意,当我使用。/Controller/Action
路径约定查看视图名时,它就工作了