JSON.stringify 抛出错误"A circular reference was detected while serializing an object of type 'System.R



在客户端,一个对象"selectedMeter"是用JavaScript构建的。这个对象通过ajax调用发送到服务器,并传递给mvc控制器。

$.ajax({
url: 'SaveManualMeter',
type: "POST",
cache: false,
contentType: "application/json; charset=utf-8",
data: **JSON.stringify({ clientId: selectedClientId, manualMeter: selectedMeter** }),
complete: function () {

在本地测试时,它可以工作,但当网站发布时,它会抛出错误在序列化"System.Reflection.RuntimeModule"类型的对象时检测到循环引用。

  • [InvalidOperationException:序列化类型为"System.Reflection.RuntimeModule"的对象时检测到循环引用。]
  • System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o,StringBuilder sb,Int32 depth,Hashtable objectsIUse,SerializationFormat SerializationFormat,MemberInfo currentMember)+1856
  • System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o,StringBuilder sb,Int32 depth,Hashtable objectsIUse,SerializationFormat SerializationFormat,MemberInfo currentMember)+266
  • System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o,StringBuilder sb,Int32 depth,Hashtable objectsIUse,SerializationFormat SerializationFormat)+668

控制器看起来像这个

public ActionResult
SaveManualMeter(string clientId, ManualMeter manualMeter)

有人知道问题出在哪里吗?

manualmeter的结构看起来像

[JsonObject(IsReference = false)]
public class ManualMeter
{
public int Id { get; set; }      
public string Ean { get; set; }        
public PeriodType Period { get; set; }        
public string TagTable { get; set; }
public string TagTableId { get; set; }
public int Overflow { get; set; }
public string TZ { get; set; }
public DataLogger DataLogger { get; set; }
public Tag Tag { get; set; }
public List<ManualMeterAction> ManualMeterActions { get; set; }       
}
public class ManualMeterAction
{
public int Id { get; set; }
public ManualMeterActionType Type { get; set; }
//navigation properties
public int ManualMeterId { get; set; }
public int UserId { get; set; }
}

发布的原始json对象看起来不错

{"clientId":"11","manualMeter":{"Tag":{"Name":"22","Unit":"Unknown","TagType":"0","Content":"1"},"Id":0,"Ean":"","ManualMeterActions":[],"Period":"0","Overflow":"22","TZ":"Europe/Brussels"}}

原始json图像

我认为问题在于与DataLogger和Tag的表关系。为了避免这种情况,创建一个视图模型,删除任何关系,如下所示:

public class ManualMeterViewModel { 
public string Ean { get; set; } 
public string TagTable { get; set; }
public string TagTableId { get; set; } 
public int Overflow { get; set; } 
public string TZ { get; set; } 
public List<ManualMeterAction> ManualMeterActions { get; set; } 
}

在你的控制器中使用如下:

public ActionResult
SaveManualMeter(string clientId, ManualMeterViewModel manualMeter){
var realmanualMeter = new ManualMeter(){
Ean = manualMeter.Ean,
TagTable = manualMeter.TagTable
… 
};
}

希望这能有所帮助。

相关内容

最新更新