我已经通过脚手架生成了我的Web Api Controller,我添加了WebApiConfig和Web Api,但返回了错误的数据。
例如: 我有一些实体 - 具有属性ID名称,姓氏等的玩家和PositionId,具有属性名称和ID的位置。如果我想通过普通的PositionController访问一个位置它工作得很好但是当我试图通过web api访问一个位置它返回我所有与这个位置相关的对象。
E.g。我想通过网址api/PositionsAPI/1
获得一个位置
它应该返回
{"PositionId":1,"name":"Defensive midfield"}
但它返回
{"Players":[{"Team":{"Players":[{"PlayerId":4,"Name":"Piotrek","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1}],"TeamId":1,"Name":"FC. Barcelona","City":"Barcelona","Founded":"1899-11-29T00:00:00"},"PlayerId":2,"Name":"Jan","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1},{"Team":{"Players":[{"PlayerId":2,"Name":"Jan","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1}],"TeamId":1,"Name":"FC. Barcelona","City":"Barcelona","Founded":"1899-11-29T00:00:00"},"PlayerId":4,"Name":"Piotrek","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1}],"PositionId":1,"name":"Defensive midfield"}
所以你可以看到它返回与这个位置相关的所有玩家。我不知道为什么会这样。
这是来自我的web api控制器的方法,负责api/PositionsAPI/1
[ResponseType(typeof(Position))]
public IHttpActionResult GetPosition(int id)
{
Position position = db.Positions.Find(id);
if (position == null)
{
return NotFound();
}
return Ok(position);
}
答案 0 :(得分:1)
您可以使用所需的属性返回匿名对象。例如,
var position = db.Positions // Make sure type is var
.Where(x => x.PositionId == id)
.Select(x => new
{
PositionId = x.PositionId,
name = x.name
})
.FirstOrDefault();
或禁用序列化参考。
db.Configuration.ProxyCreationEnabled = false;
答案 1 :(得分:0)
如果没有看到您对实体建模的方式有点困难,请检查您的路由是否配置正确。例如,您提到过:
API / PositionsAPI / 1
我假设PositionsAPI
是您的控制器,而您的位置对象如下所示:
public class Position
{
public int PositionId {get; set;}
public string name {get; set;}
}
所以你应该看到你期望的JSON ......
确保您在正确的控制器中使用正确的方法。尝试在方法的第一行添加断点,从Visual Studio运行它并尝试通过一些REST客户端(如Postman)获取数据。如果您没有通过调用相同的端点来访问断点,那么您很可能遇到路由问题。
为了修复为每个控制器指定Routes
,如下所示:
[RoutePrefix("PositionsAPI")]
public class PositionsAPIController : ApiController
在您的方法上执行此操作以确保您没有使用其他方法:
//GET: api/PositionsAPI/1 (this is just to make it easier for future reference)
[ResponseType(typeof(Position))]
[HttpGet]
[Route("{id}")]
public IHttpActionResult GetPosition(int id)
{
Position position = db.Positions.Find(id);
if (position == null)
{
return NotFound();
}
return Ok(position);
}
希望有所帮助!