2016-10-20 1 views
0

Я знаю, что по названию трудно понять, но я попытаюсь объяснить. У меня есть база данных сотрудников, html-страница, связанная со сценарием и контроллером в моем приложении web api. Поэтому, когда я нажимаю кнопку на моей странице html, относительный скрипт javascript отправляет запрос на отправку на мой контроллер. Контроллер обращается к базе данных и возвращает IEnumerable в мой файл javascript. Запрос, который контроллер делает в базе данных, является следующим:Доступ к IEnumerable, возвращаемый POST-запросом на стороне javascript (веб-API)

[HttpPost] 
public IEnumerable<Employee> Post([FromBody] string name) 
{ 
    IEnumerable<Employee> query = Enumerable.Empty<Employee>(); 
    if (!String.IsNullOrEmpty(name)) 
    { 
     query = from e in _db.Employees 
     where e.Name.Contains(name) 
     select e; 
    } 
    return query; 
} 

Эта информация передается скрипту. Моя проблема в том, что мне не удается получить доступ к единичным объектам, возвращаемым из запроса. Я отладил код и убедился, что запрос возвращает Перечислимый объектов, содержащих правильную информацию, которую я задал. На мой сценарий, я пытался получить доступ к членам, как:

$.post("api/employees", { '': insertedText }, function (result) { 
console.log(result[0].name); 
}); 

поэтому вызов console.log (результат [0] .name); должно напечатать имя первого сотрудника, но вместо этого оно не будет. Можете ли вы помочь мне понять, как правильно обращаться к такой информации?

+1

вы можете предоставить ответ API? спасибо – MrVoid

+1

Я думаю, у вас есть свойство 'Name' вместо' name'. Можете ли вы предоставить код «Сотрудник» и ответ API? –

+0

вы можете попробовать следующее: return query.toList(). Поскольку IEnumerable не имеет значения, это указатель. Поскольку он будет заполнен с помощью toList. –

ответ

1

Ваше лицо Работник имеет Name собственности, но в JavaScript, вы пытаетесь прочитать name свойство, которое не существует. Вы можете попробовать console.log(result) результат, чтобы увидеть, что api в порядке.

Несколько вещей, я замечаю, и вы должны это исправить:

  1. Так как это просто Get работников, вы должны использовать HTTP GET, а не должность. (Апи/сотрудников? Имя = JOHN)

  2. Рассмотрим вызова .ToList() в конце запроса, потому что без него, вы возвращаете IQueryable, и это, вероятно, не то, что вы хотели, так как вы назначаете его IEnumerable.

  3. Вы могли бы упростить код для этого:

    [HttpGet] 
    public IEnumerable<Employee> Get([FromQuery] string name) 
    { 
        if (!String.IsNullOrEmpty(name)) 
        { 
         //Return null for brevity, but you should consider 
         //returning a message saying no users were found matching the criteria. 
         return null; 
        } 
        return _db.Employees.Where(x => x.Name.Contains(name)).ToList(); 
    } 
    

    И для будущего рефакторинга, его обычно считается плохой практикой возвращения ваших объектов домена в контроллерах, например вашего класса Employee. Подумайте о создании DTO или ViewModel и верните его.

0

IEnumerable является указателем, и он не имеет значения. Если вы хотите вернуть значение, вы должны вернуть список.

Попробуйте это:

[HttpPost] 
    public IEnumerable<Employee> Post([FromBody] string name) 
    { 
     IEnumerable<Employee> query = Enumerable.Empty<Employee>(); 
     if (!String.IsNullOrEmpty(name)) 
     { 
      query = from e in _db.Employees 
      where e.Name.Contains(name) 
      select e; 
     } 
     return query.ToList(); 
    } 
+0

@ Михаэль Неофитов был прав в комментариях. Это была проблема присвоения имен. Теперь он работает и без листинга ToList. Если вы можете объяснить мне, почему я хотел бы принять ваш ответ правильно! – Tarta

1

.NET сериализация создает строки для свойств, как они есть, если вы не отмеченные свойств с атрибутами, которые переопределяют стандартные сериализации.

Таким образом, свойство Name вашего Employee класса будет сериализовать Name и не как name, и вы пытаетесь получить вместо точно name из Name в JavaScript.

Попробуйте изменить свой сценарий следующим образом:

$.post("api/employees", { '' : insertedText}, function (result) { 
    console.log(result[0].Name); 
}); 
Смежные вопросы