如果没有找到行,如何返回404?但是,以下代码在行return NotFound()
上收到错误。
错误1无法将类型'System.Web.Http.Results.NotFoundResult'隐式转换为'System.Collections.Generic.IEnumerable< webapi.Models.Product>”。存在显式转换(您是否错过了演员?)
public IEnumerable<Product> GetProductsByReportId(int rid)
{
using (var db = new MyContext())
{
var query = from b in db.table where b.rid == rid select b;
if (query == null)
{
return NotFound(); // Error!
}
return query.ToList();
}
}
答案 0 :(得分:2)
您无法将 System.Web.Http.Results.NotFoundResult 设置/转换为产品。
当GetProductsByReportId的结果为空时,您必须修改调用方法以返回404(或消息)。
public IEnumerable<Product> GetProductsByReportId(int rid)
{
using (var db = new MyContext())
{
var query = from b in db.table where b.rid == rid select b;
if (query == null)
{
return null;
}
return query.ToList();
}
}
即
int id = 1;
List<Product> products = GetProductsByReportId(id);
if(products == null) {
var message = string.Format("Product with id = {0} not found", id);
HttpError err = new HttpError(message);
return Request.CreateResponse(HttpStatusCode.NotFound, err);
}
答案 1 :(得分:1)
错误消息说明了一切。
当您的方法签名返回System.Web.Http.Results.NotFoundResult
IEnumerable<Product>
你可以做的一件事是:
if (query == null)
return null;
然后在调用此方法的代码中,处理列表为空的事实。
正如您在标签中提到的,asp.net Web api,您可以在控制器中执行类似的操作(假设您的控制器正在返回HttpResponseMessage
):
[HttpGet]
public HttpResponseMessage GetProducts(int id)
{
var prods = GetProductsByReportId(id);
if (prods == null)
return Request.CreateResponse(HttpStatusCode.NotFound);
else
return Request.CreateResponse(HttpStatusCode.OK, prods);
}