Ajax Breeze.js:处理空结果

Ajax Breeze.js:处理空结果,ajax,http-status-code-404,breeze,Ajax,Http Status Code 404,Breeze,假设我有一个items:/items/{id}的详细页面。用户当然可以尝试任何随机id,但如果他没有访问该项目的权限,我将返回没有数据的详细信息页面,这不是很好。我宁愿返回404或204。然而,使用BreezeWebAPI,我将返回一个IQueryable,因此我不能返回错误,我必须在客户端处理空集。做这件事最好的方法是什么?我正在考虑检查结果是否为空,然后重定向到自定义404页面,但想知道是否有更好的方法 谢谢您可以在IQueryable方法中抛出404错误,如下所示 [HttpGet] pu

假设我有一个items:/items/{id}的详细页面。用户当然可以尝试任何随机id,但如果他没有访问该项目的权限,我将返回没有数据的详细信息页面,这不是很好。我宁愿返回404或204。然而,使用BreezeWebAPI,我将返回一个IQueryable,因此我不能返回错误,我必须在客户端处理空集。做这件事最好的方法是什么?我正在考虑检查结果是否为空,然后重定向到自定义404页面,但想知道是否有更好的方法


谢谢

您可以在IQueryable方法中抛出404错误,如下所示

[HttpGet]
public IQueryable<Customer> CustomersWithHttpError() {
  // throw new HttpResponseException(HttpStatusCode.NotFound);
  var responseMsg = new HttpResponseMessage(HttpStatusCode.NotFound);
  responseMsg.Content = new StringContent("Custom error message");
  responseMsg.ReasonPhrase = "Custom Reason";
  throw new HttpResponseException(responseMsg);
}
[HttpGet]
公共IQueryable CustomerWithHttpError(){
//抛出新的HttpResponseException(HttpStatusCode.NotFound);
var responseMsg=新的HttpResponseMessage(HttpStatusCode.NotFound);
responseMsg.Content=newstringcontent(“自定义错误消息”);
responseMsg.ReasonPhrase=“自定义原因”;
抛出新的HttpResponseException(responseMsg);
}

当您编写返回IQueryable的服务/Web API控制器方法时,您有意识地决定您的HTTP资源是一个集合。集合可能为空。。。但空集合作为资源与完整集合一样有效。已找到集合,正确的响应是200,而不是404

如果您的HTTP请求是针对特定项的(例如,您有一个端点设计用于返回单个对象,其路由类似于~/customers/:id),那么返回状态为404的HTTP响应是有意义的。如果愿意,可以同时使用这两种端点。微风不会迫使你进入梦幻世界。这只是一种选择。您可以混合使用这两种端点

对我来说,更大的问题是数据(客户)和UI(页面)之间可能存在混淆。Web API没有返回页面;它正在返回数据

我假设您正在构建一个“单页应用程序”,它有一个详细屏幕。如果您导航到一个细节屏幕,尝试按Id获取该屏幕的实体,并发现这样一个实体不存在,那么您确实必须决定应该发生什么。现在你必须决定去哪里

该决定独立于HTTP状态代码。您可以将客户端屏幕重新定向到安全位置(例如,客户列表),而无需担心HTTP状态代码。HTTP状态代码是HTTP协议的一部分,用于通过web进行通信。您的应用程序自己的客户端屏幕导航不会跨越web,并且没有必要(也没有必要)采用该协议


如果检测到Web API返回了一个空集合,您应该不会有问题。没有尴尬。警方不会逮捕你的。只需根据需要重新定向。

这种方法的唯一问题是过滤器通常位于客户机上。例如,在服务器上,我通常有
IQueryable Customers(){//返回所有客户}
。然后在客户机上,我将使用breeze谓词进行过滤。谓词可能导致结果集为空。有没有一种方法可以在
EFContextProvider
中捕获它?您可以在
EFContextProvider
的子类中、在包装了“EFContextProvider”的存储库类中或在Web API控制器方法中检测到它。但是,无论采用哪种方法,您都必须首先在服务器上执行查询,而您不希望这样做。。。不是因为这个原因。我认为你正陷入毫无意义的纯洁观念中,而这些观念对你毫无帮助。看看我的答案。谢谢沃德和杰伊。我认为在这种情况下,重新定向是最有意义的+有趣的答案是:)