0

検索しようとしましたが、問題を解決できません。

これは私のコントローラーです:

    public JsonResult Index()
    {
        return this.Json(TempData["displayList"], JsonRequestBehavior.AllowGet);
    }
    public JsonResult AddToCart(string id)
    {
        QuotationModels objQuote = new QuotationModels();

        List<QuotationModels> listQuote = objQuote.GetObjectInSession;

        int itemID = Int32.Parse(id);

        int index = -1;
        if(listQuote != null)
           index = listQuote.FindIndex(p => p.ItemdID== itemID);

        if (index >= 0)
        {
            listQuote[index].ProductQty++;
            objQuote.AddToSession(listQuote);
        }
        else
        {
            int _id = Convert.ToInt16(id);
            var _product = DataContext.DataContext.Items.FirstOrDefault(s => s.ID == _id);

            QuotationModels quote = new QuotationModels();
            quote.ItemdID = _product.ID;
            quote.ItemNote = _product.Notes;
            quote.Phone = "";
            quote.PictureName = _product.PictureName;
            quote.ProductName = _product.Name;
            quote.ProductPrice = (decimal)_product.Price;
            quote.ProductQty = 1;
            quote.ShoppingCartId = "";
            quote.Total = 0;
            quote.Email = "";
            quote.CustomerID = 0;
            quote.CusName = "";
            quote.Company = "";
            quote.Address = "";
            objQuote.AddToSession(quote);

        }

        int itemInSession = objQuote.GetObjectInSession.Sum(s => s.ProductQty);
        TempData["displayList"] = objQuote.GetObjectInSession;

        return Json(new
        {
           ja = itemInSession
        }, JsonRequestBehavior.AllowGet);

    }

これは私のTempDataのサンプルデータです

しかし、Index() ビューを参照すると、エラーでしたA circular reference was detected while serializing an object of type

誰でも解決策を教えてください。どうもありがとう。

4

3 に答える 3

1

何をシリアライズしようとしているのかはわかりませんが、何をしなければならないかについての手がかりはここにあります!

循環参照の問題は、たとえば、製品への参照を含む見積もりがあることを意味します。そして、その製品自体が親 Quote への参照を持っていること。

JSONで単純にシリアル化することはできません。これは、次のようになるためです。

Quote :
 - some attributes..
 - Product
   - some attributes
   - Quote 
     - some attributes...
     - Product... and so on !

しかし、親 Quote を持っている場合、子エンティティに関係を持たせることは本当に興味深いことでしょうか? サーバー側のモデルかもしれませんが、それは一種の冗長であり、クライアントには必要ありません。

その場合にできることは、不要なものを含まず、循環参照になる可能性のある他のクラスを作成することです。

たとえば、Quote のような SimpleQuote がありますが、Product プロパティの代わりに SimpleProduct プロパティがあります。

オリジナルクラス :

public class Quote{
    public int Id;
    public Product Product;
    public double Amount;
}

public class Product{
    public int Id;
    public Quote Quote;
    public string Name;
}

シリアル化のための単純なクラス:

public class SimpleQuote{
    public int Id;
    public SimpleProduct Product;
    public double Amount;
}

public class SimpleProduct{
    public int Id;
    public int QuoteId;
    public string Name;

}

次のような拡張メソッドを作成できます。

public static void ToSimpleQuote(this Quote quote){
    return new SimpleQuote(){ 
        Id = quote.Id,
        Amount = quote.Amount,
        Product = quote.Product.ToSimpleProduct()
    };
}

public static void ToSimpleProduct(this Product product){
    return new SimpleProduct(){
        Id = product.Id,
        Name = product.Name,
        QuoteId = product.Quote.QuoteID
    };
}

したがって、次のようなものがある場合:

public ActionResult Index(){
    ....
    return Json(myQuote, JsonRequestBehavior.AllowGet);
}

代わりにこれを行うことができます:

public ActionResult Index(){
    ....
    return Json(myQuote.ToSimpleQuote(), JsonRequestBehavior.AllowGet);
}
于 2012-10-05T12:02:57.503 に答える
0

戻らないでthis。代わりに次を使用します。

 public JsonResult Index()
    {
        return Json(TempData["displayList"], JsonRequestBehavior.AllowGet);
    }

にあるもののオブジェクトグラフを表示できますTempData["displayList"]か?

階層がループしている可能性があります。

于 2012-10-05T09:44:25.017 に答える