首页 文章

如何从 Asp.Net 核心视图组件返回错误的 HTTP 状态代码

提问于
浏览
3

我试图从 Asp.Net Core 中的 View Component 返回 HTTP 500 或 BadRequest()结果,但是这种返回类型似乎不适用于 View Components。状态代码返回类型是否可用于 View Components 或我的设计是否有错?

我通过 ajax 调用我的控制器动作,如下所示......

<a asp-controller="Client" asp-action="LoadVisit" asp-route-id="@item.VisitID" data-ajax="true" data-ajax-method="GET" data-ajax-update="#ClientVisit" data-ajax-mode="replace" data-ajax-failure="AjaxOnFailure(xhr, status, error)" role="button"><i class="fa fa-folder-open-o"></i></a>

我的控制器动作是 calling/returning 我的视图组件,如下所示......

public IActionResult LoadVisit(int? id)
{

    if (id == null || id == 0)
    {
        return NotFound();
    }

    return ViewComponent("ClientVisit", new { visitID = id.GetValueOrDefault() });

}

我的 ClientVisit View 组件具有以下内容......

public async Task<IViewComponentResult> InvokeAsync(int? clientID, int? visitID)
{

    try
    {
        var model = new VisitViewModel();
        model = await visitAPI.GetVisit(clientID, visitID);
        return View(model);
    }
    catch (Exception ex)
    {
        return Content(ex.Message);
    }

}

当我的数据库调用model = await visitAPI.GetVisit(clientID, visitID)失败时,我想返回return StatusCode(500, ex.ToString())但它不可用,所以我的 ajax 调用认为我的请求是成功的,这是错误的。

3 回答

  • 2

    只要你在访问中有 HttpResponse 它应该工作。或者,由于返回 ViewComponent 先决条件检查,然后设置状态。

    try
    {
        var model = new VisitViewModel();
        model = await visitAPI.GetVisit(clientID, visitID);
        return View(model);
    }
    catch (Exception ex)
    {
         Response.StatusCode = (int)HttpStatusCode.BadRequest;
         return null;
    }
    
  • 2

    查看组件文档:

    视图组件永远不会处理请求,

    视图组件方法在签名上重载,而不是当前 HTTP 请求中的任何细节,

    因此,据我所知,您将无法在 View Component 中创建 HTTP 响应(如StatusCode()BasRequest())。

    此外,您可以访问HttpContext.Response.StatusCode,但这也无法正常工作。

    此外,您无法从 View Components 返回null - 您将看到异常:

    InvalidOperationException: A view component must return a non-null value.
    

    由于上述原因,我不知道如何从 View Component 返回状态代码。

    也许,你可以将 View Component 转换为简单的'helper'方法,这样你就可以在行动中捕获异常,然后根据需要返回StatusCode(500)

  • 1

    包含控制器应该拥有决定是否返回状态代码的逻辑,然后只有在将所需数据传递给视图组件时才会出现问题。这应该消除了视图组件与管道交互的任何需要。

    View 组件不使用模型绑定,仅依赖于调用时提供的数据

    因此,将调用移动到视图组件的 api out并进入控制器,然后如果对 api 的调用正常,则将结果数据传递给视图组件。

    ref https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-2.1

    所以你的例子就是这样的:

    public IActionResult LoadVisit(int? id)
    {
    
        if (id == null || id == 0)
        {
            return NotFound();
        }
        var model = new VisitViewModel();
        try
        {
            model = await visitAPI.GetVisit(clientID, visitID);
        }
        catch (Exception ex)
        {
            return Content(ex.Message);
        }
    
        return ViewComponent("ClientVisit", model });
    
    }
    

    public async Task<IViewComponentResult> InvokeAsync(VisitViewModel model)
    {
            return View(model);
    }
    

相关问题