Angularjs 使用Web Api 2和Angular,是否指定不返回任何数据?(也没有错误)

Angularjs 使用Web Api 2和Angular,是否指定不返回任何数据?(也没有错误),angularjs,asp.net-web-api2,Angularjs,Asp.net Web Api2,假设我的API为简单起见,返回查看产品的日期列表。某些产品从未被查看过,将返回一个空列表。当这种情况发生时,我想展示: 此产品尚未被查看 并隐藏带有产品视图日期的表。我在返回IHttpActionResult的控制器中执行此操作: if (itemViewedDto.Count > 0) { return Ok(itemViewedDto); } else { return Ok(new {message = "No data"}); } 在客户端上(itemView

假设我的API为简单起见,返回查看产品的日期列表。某些产品从未被查看过,将返回一个空列表。当这种情况发生时,我想展示:

此产品尚未被查看

并隐藏带有产品视图日期的表。我在返回
IHttpActionResult
的控制器中执行此操作:

if (itemViewedDto.Count > 0)
{
     return Ok(itemViewedDto);
}
else
{
    return Ok(new {message = "No data"}); 
}
在客户端上(itemViewed只是http响应负载):

然后使用ng if或其他什么来显示相应的响应,看看是否有响应

这有什么问题吗?这是公认的模式吗?如果没有,还有什么更好的方法?我问的是概念上的问题,而不是这个特殊情况


目前它对我来说很有效,只是我很好奇它是否错了

就个人而言,我会避免在成功调用API时返回两种不同类型的响应。它看起来很臭,而且毫无用处。只要返回一个列表,即使它是一个空列表。在角度方面,只需检查阵列是否为空,并基于此执行显示逻辑。

使用正确的HTTP状态代码并返回204 No内容。WebApi不提供“NoContent”结果,但您可以使用“NoContentResult”类很容易地提供一个结果。这样,您就可以坚持使用IHTTPacationResults,而不会退回到HttpResponseMessages

public class NoContentResult : OkResult
{
    public NoContentResult(ApiController controller) : base(controller) { }

    public override Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = base.ExecuteAsync(cancellationToken).Result;
        response.StatusCode = HttpStatusCode.NoContent;
        return Task.FromResult(response);
    }
}
如果您为所有控制器使用基类,您可以将其添加到基类中,然后它会感觉像是一个Ok响应

public abstract class BaseApiController : ApiController
{
    /// <summary>
    /// Returns a No Content response.
    /// </summary>
    protected NoContentResult NoContent()
    {
        return new NoContentResult(this);
    }
}

现在,在JavaScript中,您可以响应不同的状态代码,而不是解析正文。

我想我可以简单地检查响应是否为空,但有人告诉我要创建message属性。本质上,我想知道这部分是不是错了。我觉得这很难看。为什么不总是返回相同的东西:itemViewDto。如果UI层希望在列表为空时显示不同的消息并隐藏一个表,那么它只需测试列表是否为空。例如,请参阅,其中列出了名为
DfsDfsDfsGQFGQDGSqDgsDfQfqFqSfqSfqSfqSfqSfqSf
if (itemViewedDto.Count > 0)
{
    return Ok(itemViewedDto);
}
else
{
    return new NoContentResult(this);
}
public abstract class BaseApiController : ApiController
{
    /// <summary>
    /// Returns a No Content response.
    /// </summary>
    protected NoContentResult NoContent()
    {
        return new NoContentResult(this);
    }
}
if (itemViewedDto.Count > 0)
{
    return Ok(itemViewedDto);
}
else
{
    return NoContent();
}