在客户端,一个对象"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
…
};
}
希望这能有所帮助。