2016-10-20 15 views
0

タイトルによって、わかりにくいことがわかりますが、私は説明しようとします。私は従業員のデータベース、HTMLページをスクリプトと私のWebアプリケーションのコントローラに接続している。だから、私は私のHTMLページ上のボタンをクリックすると、相対的なJavaScriptスクリプトは私のコントローラに投稿要求を送信します。コントローラはデータベースにアクセスし、IEnumerableをjavacriptファイルに返します。JavaScript側(Web API)のPOST要求によって返された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; 
} 

この情報は、スクリプトに渡されます:コントローラがデータベースにないクエリは次のようです。私の問題は、私はクエリから返された単一のオブジェクトにアクセスすることができないということです。私はコードをデバッグし、クエリが私が尋ねた正しい情報を含むオブジェクトのEnumerableを返すことを確認しました。私のスクリプトでは、私はとメンバーにアクセスしようとしました:そう呼び出しはconsole.log(結果[0] .nameの)

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

は返された最初の従業員の名前を表示する必要がありますが、そうではありません。そのような情報に正しくアクセスする方法を理解するのを助けてくれますか?

+1

あなたはAPIレスポンスを提供することができます。

は、次のようにスクリプトを修正してください?ありがとう – MrVoid

+1

'name'の代わりに' Name'プロパティがあると思います。 'Employee'コードとAPIレスポンスを提供できますか? –

+0

これを試すことができます:return query.toList()。 IEnumerableには値がないため、ポインタです。 toListを使用してデータが移入されます。 –

答えて

1

あなたのEmployeeエンティティがName性質を持っていますが、JavaScriptで、あなたは存在しませんnameプロパティを読み取ろうとしている。

はこれを試してみてください。 console.log(result)を試すと、apiが正常であることがわかります。

私が気づくと、あなたはそれを修正する必要があります物事のカップル:

  1. これは従業員の簡単な取得であるので、あなたは、HTTP GET、ないポストを使用する必要があります。

  2. .ToList()を呼び出すことをお勧めします。これは、それがなければIQueryableを返すため、おそらくあなたが割り当てているものではないからです。 IEnumerable。

    [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クラス:

  3. あなたはこれまで、あなたのコードを簡素化することができます。 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クラスのプロパティNameNameとしてではなくnameとしてシリアル化され、あなたはJavaScriptで正確name代わりNameのを取得しようとしています。

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