【问题标题】:Return an existing razor view from middleware in asp.net core从 asp.net 核心中的中间件返回现有的剃刀视图
【发布时间】:2019-04-09 15:01:20
【问题描述】:

在我的自定义异常中间件中,我希望处理异常并返回具有用户友好消息的相同资源。

例如,当Account/Add 抛出SqlException 时,我返回Account/Add 响应,其中包含来自异常中间件的存储在TempData 中的消息。我已经 完成了这些视图引擎的工作。

我找到了this 扩展方法和用于此目的的用法,有了这个,您可以从中间件返回所有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);
}

这是我尝试过的,但它没有按预期工作,它返回一个空白页面,似乎它没有使剃刀视图引擎运行以构建我的请求页面。

如何让我的中间件使用我现有的视图正确返回 ViewResult

【问题讨论】:

    标签: razor asp.net-core-mvc asp.net-core-2.1


    【解决方案1】:

    缺少一些东西。为了使用相对路径返回视图,您需要修剪前导斜杠:

    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);
        }
    }
    

    应该可以的:)

    【讨论】:

    • 谢谢克里斯蒂安,这是我的错误,我已经忘记更改签名了。:) 但是,现在,我遇到了路由错误,路由在 Views/Home/Home/ThrowErr 内搜索我的视图而不是 Views/Home/ThrowErr .我有一个测试操作Home/ThrowErr,只是有条件地抛出错误。 (在第一个 req 抛出错误,在第二个返回视图,用于测试目的)。我只有默认的 mvc 路由。我应该使用其他路径吗?
    • 我尝试在Views/Account 中添加一个名为Add.cshtml 的视图。当我转到/Account/Add 并抛出异常时,我得到了视图。我不确定是什么导致它出现在Views/Home/Home ..
    • 请注意,当我使用 ../Controller/Action 路径约定 ViewName 时,我得到了这个工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多