2016-10-20 60 views
0

我知道標題很難理解,但我會嘗試解釋。我有一個員工數據庫,一個連接到我的web api應用程序中的腳本和控制器的html頁面。所以,當我點擊我的html頁面上的一個按鈕時,相關的javascript腳本會在我的控制器上發送一個post請求。控制器訪問數據庫並返回一個IEnumerable到我的JavaScript文件。控制器在數據庫上執行的查詢如下:訪問JavaScript方面的POST請求返回的IEnumerable(Web 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; 
} 

將此信息傳遞給腳本。我的問題是,我沒有設法訪問查詢返回的單個對象。我調試了代碼,並確保查詢返回包含我詢問的正確信息的對象的Enumerable。在我的劇本,我試圖訪問成員:

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

因此呼叫的console.log(結果[0]。名稱);應該打印返回的第一名員工的姓名,但事實並非如此。你能幫助我理解如何正確訪問這些信息嗎?

+1

可以提供API響應?謝謝 – MrVoid

+1

我想你有屬性'名稱'而不是'名稱'。你能否提供'員工'代碼和API響應? –

+0

你可以試試這個:return query.toList()。因爲IEnumerable沒有這個值,所以它是一個指針。因爲它將使用toList填充。 –

回答

1

你的僱員實體有一個Name屬性,但在Javascript中你想讀name屬性,它不存在。你可以嘗試console.log(result)的結果只是爲了看到API是好的。

一對夫婦的事情,我注意到,你應該修復它:

  1. 由於這是員工的一個簡單的獲取,你應該使用一個HTTP GET,而不是一個職位。 (api/employees?name = 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(); 
    } 
    

    併爲未來的重構,其通常被認爲是不好的做法,換來對你的控制器域對象,e.g你的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

@Mikhail Neofitov在評論中是正確的。這是一個命名問題。現在它的工作也沒有ToList強制轉換。如果你能解釋我爲什麼我想接受你的答案是正確的! – Tarta

1

.NET序列化的屬性創建的字符串,因爲他們,如果你不標明屬性,這將覆蓋標準序列化屬性。

所以,你Employee類的屬性Name將被序列化爲Name而不是name,和你想在JavaScript中獲得的確切name代替Name

嘗試修改腳本如下:

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