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

C# 如何从Asp.Net核心视图组件返回错误的HTTP状态代码,c#,asp.net-core,asp.net-core-viewcomponent,C#,Asp.net Core,Asp.net Core Viewcomponent,我试图从Asp.Net Core中的视图组件返回HTTP 500或BadRequest()结果,但是此返回类型似乎不适用于视图组件。状态代码返回类型是否可用于视图组件,或者我的设计是否有误 我正在通过ajax调用我的控制器操作,如下所示 <a asp-controller="Client" asp-action="LoadVisit" asp-route-id="@item.VisitID" data-ajax="true" data-ajax-method="GET" data-ajax

我试图从Asp.Net Core中的视图组件返回HTTP 500或BadRequest()结果,但是此返回类型似乎不适用于视图组件。状态代码返回类型是否可用于视图组件,或者我的设计是否有误

我正在通过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>
public IActionResult LoadVisit(int? id)
{

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

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

}
My ClientVisit视图组件具有以下内容

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

}
public异步任务InvokeAsync(int?clientID,int?visitID)
{
尝试
{
var model=new VisitViewModel();
model=wait visitAPI.GetVisit(clientID,visitID);
返回视图(模型);
}
捕获(例外情况除外)
{
返回内容(例如消息);
}
}

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

只要访问中有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;
}
从文件:

视图组件从不处理请求

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

据我所知,您将无法在视图组件内创建HTTP响应(如
StatusCode()
BadRequest()

您可以访问
HttpContext.Response.StatusCode
,但这也无法按您的需要工作

您不能从查看组件返回
null
-您将看到异常:

InvalidOperationException: A view component must return a non-null value.
由于上述原因,我不知道如何从视图组件返回状态代码


也许,您可以将视图组件转换为简单的“helper”方法,这样您就可以捕获操作中的异常,然后返回
StatusCode(500)
如您所愿?

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

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

因此,将对视图组件的api的调用移出到控制器中,然后将结果数据传递到视图组件中(如果对api的调用正常)

参考号

下面是你的例子:

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异步任务InvokeAsync(VisitViewModel模型)
{
返回视图(模型);
}

不幸的是,视图组件中没有可用的HttpResponse。编译错误当前上下文中不存在名称“Response”检查来自“ViewComponent”的结果时情况如何(“ClientVisit”,new{visitID=id.GetValueOrDefault());类似:
var view=ViewComponent(“ClientVisit”,新的{visitID=id.GetValueOrDefault()});if(view==null){Response.StatusCode=(int)HttpStatusCode.BadRequest;返回null;}返回视图
您可以在
HttpContext
中找到
Response
,例如:
HttpContext.Response.StatusCode=,但仍然不起作用,因为“视图组件从不直接处理请求”。在这种情况下使用视图组件有什么好处?如果所有的工作都是在控制器中完成的,那么为什么不返回一个比视图组件更容易设置的部分视图呢?我认为视图组件的用途是它可以处理逻辑以避免通过控制器进行管道连接。视图组件可以作为dll/nuget包共享。如果不使用预编译视图,则无法使用分部。可能还有其他原因,但这是我们目前感兴趣的一个原因。
public async Task<IViewComponentResult> InvokeAsync(VisitViewModel model)
{
        return View(model);
}