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

我不确定您要序列化什么,但这里有一个关于您必须做什么的线索!

循环引用的问题意味着您有例如一个报价,其中包含对产品的引用。并且该 Product itsel 引用了父 Quote。

你不能简单地用 JSON 序列化它,因为它会做这样的事情:

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

但是现在,如果您有父引用,那么在子实体上建立关系对您来说真的很有趣吗?也许在您的服务器端模型中,但它有点多余,对客户端来说不是必需的。

在这种情况下,您可以做的是创建其他不包含不必要的类并且可能导致循环引用的类。

例如,您将有一个 SimpleQuote,它类似于 Quote,但它没有 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 回答
0

您可以将属性 XMLIgnore 用于严格的 XML 序列化或将 NonSerialized 用于更广泛的目标。

只需使用这些属性中的任何一个标记循环的属性或字段,它就应该忽略它们。

在具有确实是循环引用的虚拟成员属性的实体框架场景中运行良好。

于 2014-04-18T19:31:53.877 回答