在序列化类型为' MicrossDashboard.DB.Customer'的对象时检测到循环引用。

时间:2016-09-21 15:54:57

标签: asp.net-mvc kendo-asp.net-mvc

我对MVC很新,因此无法在我的DBContext中使用表中的数据填充DropDown列表。我有以下设置:

在我的控制器中,我有以下ActionResult:

public ActionResult Index()
{
    DBContext db = new DBContext();

    return View(db.Customers);

}

然后我正在强烈地输入我的观点:

@model System.Collections.Generic.IEnumerable<MicrossDashboard.DB.Customer>

然后在同一视图中我试图将其绑定到下拉列表:

        <div class="form-group">
            <label for="Customer" class="col-sm-2 control-label">Customer:</label>
            <div class="col-sm-2">
                <span hidden id="customerValue">@customer.ToString()</span>
                @(Html.Kendo().DropDownList().Name("ddlCustomer").DataTextField("CustomerName").DataValueField("pk_Customer_ID").BindTo(Model))
            </div>
        </div>

我很确定就是这样。当我尝试运行该页面时,我收到以下错误:

在序列化“MicrossDashboard.DB.Customer”类型的对象时检测到循环引用。

我错过任何明显的东西吗?

1 个答案:

答案 0 :(得分:0)

  

在序列化“MicrossDashboard.DB.Customer”类型的对象时检测到循环引用。

该类在其中一个属性中引用自身。作为简化示例,请考虑以下事项:

public class MyClass
{
    public int MyInt { get; set; }
    public MyClass Inner { get { return this; } }
}

如果你要尝试序列化这个,让我们对JSON说,你最终会得到:

{
  "myInt" : 0,
  "inner" : {
    "myInt" : 0,
    "inner" : {
      "myInt" : 0,
      "inner" {
        // and so on, infinitely
      }
    }
  }
}

因此,没有该类的实例可以序列化,因为它会导致无限量的数据(更不用说溢出的堆栈)。

您的示例可能 显而易见,但问题仍然存在于您的MicrossDashboard.DB.Customer课程中。在其属性中的某个位置,可能是多个深层,该类的实例引用自身。

有多种方法可以“忽略”字段进行序列化。选项包括the JsonIgnore attributethe ScriptIgnore attribute,省略the DataMember attribute等。这取决于您执行序列化的方式。