2017-01-12 3 views
1

Я создал свой веб-Api Controller с помощью лесов, я добавил WebApiConfig и Web Api, но возвращает плохие данные.ASP.NET Web Api возвращает плохие данные

Например: У меня есть несколько объектов - Игрок с идентификационными именами атрибутов, фамилия и т. Д. И PositionId, Позиция с именем и идентификатором атрибута. Если я хочу получить доступ к одной позиции через обычный PositionController, он работает очень хорошо, но когда я пытаюсь получить доступ к одной позиции с помощью web api, он возвращает мне весь объект, который связан с этой одной позицией.

E.g. Я хочу, чтобы получить одну позицию URL 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"} 

Таким образом, вы можете увидеть, что она возвращает всех игроков, связанных с этой позицией. Я не знаю, почему это происходит.

Это метод из моего веб-контроллера апи, который отвечает за 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); 
} 

ответ

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; 
+0

Это работает! Спасибо! – azxcqqq

0

Это немного сложно, не видя, как вы моделировали свои сущности, но проверьте правильность настройки маршрутизации. Например, вы упомянули:

апи/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); 
    } 

Надежда, что помогает!