从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
路径约定查看
视图名时,它就工作了