0

私はEntity Framework 4.1のコードを最初に使用しています。ASP.NET MVC 3。私のビューにはYahoo UI(YUI)データテーブルがあります。データを取得しています(JSONを使用してグリッドにデータを取り込む)。Entity Framework 4.1:リポジトリからのデータがJSON経由で表示されない

データを取得の流れ:

Controller -> Service -> Repository 

私のコンテキストの設定:

public DbSet<Category> Categories { get; set; } 

オリジナルレポジトリ:私のサービス層からこのリポジトリ方法に

public IEnumerable<Category> GetAll() 
{ 
    return db.Categories.ToList(); 
} 

コール:

public IEnumerable<Category> GetAll() 
{ 
    return categoryRepository.GetAll(); 
} 

私のアクションメソッドのデータを取得するとYUIのDataTableにそれを渡すために:

public ActionResult JsonCategoriesList() 
{ 
    JsonEncapsulatorDto<Category> data = new JsonEncapsulatorDto<Category> 
    { 
     DataResultSet = categoryService.GetAll() 
    }; 

    return Json(data, JsonRequestBehavior.AllowGet); 
} 

JsonEncapsulatorDtoコード:私はそれを使用する場合

public class JsonEncapsulatorDto<T> 
{ 
    public IEnumerable<T> DataResultSet { get; set; } 
} 

この方法は、その後にエラーがありますデータ表。私はエラーを表示する方法を知らない。何も表示されません。私はデバッグを行い、DataResultSetに7のカウントがあることを確認しました。だから、私がやったことは、いくつかのテストデータを使用するようにリポジトリを変更し、それがうまくいったことです。違いは何ですか?結果を表示するにはどうすればよいですか?テストデータと

リポジトリ:

<div id="dtCategories"></div> 

<script type="text/javascript"> 

    YAHOO.util.Event.onDOMReady(function() { 

     var yuiDataSource = YAHOO.util.DataSource; 
     var yuiPaginator = YAHOO.widget.Paginator; 
     var yuiDataTable = YAHOO.widget.DataTable; 
     var dtCategoriesColumnDefs, dtCategoriesDataSource; 
     var dtCategoriesConfigs, dtCategoriesDataTable; 

     dtCategoriesColumnDefs = [ 
     { key: 'Name', label: 'Name' } 
     ]; 

     dtCategoriesDataSource = new YAHOO.util.DataSource('@Url.RouteUrl  (Url.AdministrationCategoryJsonCategoriesList())'); 
     dtCategoriesDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; 
     dtCategoriesDataSource.responseSchema = { 
     resultsList: 'DataResultSet', 
     fields: [ 
      { key: 'Name' } 
     ] 
     }; 

     dtCategoriesDataTable = new YAHOO.widget.DataTable('dtCategories', dtCategoriesColumnDefs, dtCategoriesDataSource); 

    }); 

</script> 

UPDATE:

カテゴリークラス:

君たちは、データテーブルのカテゴリーの私の設定を確認したい場合は

public IEnumerable<Category> GetAll() 
{ 
    List<Category> list = new List<Category>(); 
    list.Add(new Category { Name = "Brendan" }); 
    list.Add(new Category { Name = "Charlene" }); 

    return list; 
    //return db.Categories.ToList(); 
} 

わかりません

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    public bool IsActive { get; set; } 
    public int? ParentCategoryId { get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public virtual ICollection<Category> ChildCategories { get; set; } 
} 

Contextクラス:

public class PbeContext : DbContext 
{ 
    public DbSet<Category> Categories { get; set; } 
    public DbSet<Tutorial> Tutorials { get; set; } 

    protected override void OnModelCreating(DbModelBuilder dbModelBuilder) 
    { 
     dbModelBuilder.Entity<Category>() 
     .HasOptional(c => c.ParentCategory) 
     .WithMany(c => c.ChildCategories) 
     .HasForeignKey(p => p.ParentCategoryId); 
    } 
} 

UPDATE 2:

私は、Productオブジェクト(無循環参照)のリストを取得し、それがうまく移入することを別のビューを持っています。私は、データが返されたときにどのように見えるかを調べるためにデバッグしました。それは多分

[0] = {MyProject.Core.DomainObjects.Product} 
[1] = {MyProject.Core.DomainObjects.Product} 
[2] = {MyProject.Core.DomainObjects.Product} 

ことができます:...ように

[0] [System.Data.Entity.DynamicProxies.Category_9E42BCEDDE8AA695F718BEBE2224E1D34291FCAF82F801F4995EEB8449479C93] 
[1] [System.Data.Entity.DynamicProxies.Category_9E42BCEDDE8AA695F718BEBE2224E1D34291FCAF82F801F4995EEB8449479C93] 
[2] [System.Data.Entity.DynamicProxies.Category_9E42BCEDDE8AA695F718BEBE2224E1D34291FCAF82F801F4995EEB8449479C93] 

...と

製品:

カテゴリー:そして、これは、オブジェクトがリスト内のように見えた方法ですデータが返される方法のために??

答えて

1

あなたの誤差があるんアイデア。再帰的なCategoryモデル(通常、ビューモデルを使用せずにEFドメインモデルをビューに渡すとどうなるでしょうか?あなたの例では、カテゴリの名前である1つの列を含むテーブルを表示するだけです。ドメイン全体を渡すIEnumerable<Category>は犯罪のようです。たぶん不足しているスクリプトですか?たぶんこれはAdministrationCategoryJsonCategoriesList拡張メソッドですか?

ここで私はあなたのために書いた、それはあなたが始めるかもしれないと完全な作業例です:

モデル:

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    public bool IsActive { get; set; } 
    public int? ParentCategoryId { get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public virtual ICollection<Category> ChildCategories { get; set; } 

    // Obviously this will be in your repository but for the purpose of 
    // this demonstration let's hardcode some data 
    public static IEnumerable<Category> GetAll() 
    { 
     List<Category> list = new List<Category>(); 
     list.Add(new Category { Name = "Brendan" }); 
     list.Add(new Category { Name = "Charlene" }); 
     return list; 
    } 
} 

コントローラー:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult JsonCategoriesList() 
    { 
     var data = Category.GetAll().Select(x => new 
     { 
      // We select only what we need for our view => the name 
      // if you need something else, well, select it here 
      Name = x.Name 
     }).ToList(); 
     return Json(new { DataResultSet = data }, JsonRequestBehavior.AllowGet); 
    } 
} 

ビュー:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <title>YUI Test</title> 
    <link type="text/css" rel="stylesheet" href="http://yui.yahooapis.com/2.9.0/build/datatable/assets/skins/sam/datatable.css"> 
</head> 
<body> 
    <div id="dtCategories"></div> 

    <script src="http://yui.yahooapis.com/2.9.0/build/yahoo-dom-event/yahoo-dom-event.js"></script> 
    <script src="http://yui.yahooapis.com/2.9.0/build/element/element-min.js"></script> 
    <script src="http://yui.yahooapis.com/2.9.0/build/datasource/datasource-min.js"></script> 
    <script src="http://yui.yahooapis.com/2.9.0/build/connection/connection-min.js"></script> 
    <script src="http://yui.yahooapis.com/2.9.0/build/datatable/datatable-min.js"></script> 


    <script type="text/javascript"> 
     YAHOO.util.Event.onDOMReady(function() { 
      var yuiDataSource = YAHOO.util.DataSource; 
      var yuiDataTable = YAHOO.widget.DataTable; 
      var dtCategoriesColumnDefs, dtCategoriesDataSource; 
      var dtCategoriesConfigs, dtCategoriesDataTable; 

      dtCategoriesColumnDefs = [{ key: 'Name', label: 'Name'}]; 

      dtCategoriesDataSource = new YAHOO.util.DataSource('@Url.Action("JsonCategoriesList")'); 
      dtCategoriesDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; 
      dtCategoriesDataSource.responseSchema = { 
       resultsList: 'DataResultSet', 
       fields: [{ key: 'Name'}] 
      }; 

      dtCategoriesDataTable = new YAHOO.widget.DataTable(
       'dtCategories', 
       dtCategoriesColumnDefs, 
       dtCategoriesDataSource 
      ); 
     }); 
    </script> 
</body> 
</html> 
は、
+0

グリッドを稼働させたいだけなので名前があるのはなぜですか。後でもう一方を追加します。ありがとう、あなたのソリューションは正常に動作します:) –

+0

私はvarを使用するのが好きではありません、私はそれを置き換えることができますか? –

+0

@Brendan Vogt、これは 'var'を参照していますか? –

0

循環参照があるかどうかを確認するためにカテゴリー型定義を投稿してください、これは役立つかもしれない:Json and Circular Reference Exception

+0

私の更新を見てください。 –

+0

循環参照の問題であるかどうかは確かではありません(例外的に「エラーの黄色い画面」例外情報を表示するためにcustomerrorsをオフにすることはできますが)テストするCategoryクラスのParentCategoryプロパティをコメントアウトしますそれは –

+0

例外エラーは発生しません。グリッドで「データエラー」と表示されます。 –

関連する問題