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

时间:2016-11-29 05:52:12

标签: c# asp.net-core asp.net-core-viewcomponent

我正在尝试从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>

我的控制器操作是调用/返回我的View组件,如下所示......

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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

来自View Components文档:

  

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

     

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

据我所知,您无法在View组件中创建HTTP响应(如StatusCode()BasRequest())。


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


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

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


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

也许,您可以将View Component转换为简单的帮助&#39;方法,所以你可以在行动中捕获异常,然后根据需要返回StatusCode(500)

答案 2 :(得分:1)

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

  

视图组件不使用模型绑定,并且仅取决于调用时提供的数据

因此,将调用移至视图组件的api ,然后移入控制器,然后在对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);
}