2013-04-29 8 views
10

Serialisieren Ich habe eine asp.net MVC 3 Controller Aktionsmethode wie folgt aus:Eine kreisförmige Referenz detektiert wurde, während ein Objekt des Typs ‚System.Reflection

public JsonResult GetRecordingRates(int Id) 
{    
    List<DefaultRateChart> defaultRateCharts = new List<DefaultRateChart>(); 
    using (IDefaultRateChartManager defaultRateChartManager = new ManagerFactory().GetDefaultRateChartManager()) { 
     defaultRateCharts = defaultRateChartManager.GetAll().Where(rc => rc.Currency.Id == Id && (!rc.NumberPrefix.StartsWith("#") || rc.NumberPrefix.StartsWith("Default")) && rc.AccountCredit == "Credit").ToList(); 
    } 
    return Json(defaultRateCharts); 
} 

I dieser Liste senden möchte jquery ajax Erfolg Verfahren aber ich bin immer 500 Interner Fehler Server

meine ajax-Aufruf ist wie folgt:

$.ajax({ 
type: "POST", 
dataType: "json", 
url: "/Home/GetRecordingRates", 
data: { 
    Id: $("#hdCurrencyId").val()     
}, 
success: function (data) { 
     alert(data); 
    } 
}); 

In firebug XHR unter Antwort Registerkarte i t sagt:

Beim Serialisieren eines Objekts vom Typ 'System.Reflection.RuntimeModule' wurde ein Zirkelverweis erkannt.

[EDIT]

änderte ich die Aktion-Methode dazu:

public JsonResult GetRecordingRates(int Id) 
{ 
    List<DefaultRateChart> defaultRateCharts = new List<DefaultRateChart>(); 
    using (IDefaultRateChartManager defaultRateChartManager = new ManagerFactory().GetDefaultRateChartManager()) 
    { 
     defaultRateCharts = defaultRateChartManager.GetAll().Where(rc => rc.Currency.Id == Id && (!rc.NumberPrefix.StartsWith("#") || rc.NumberPrefix.StartsWith("Default")) && rc.AccountCredit == "Credit").ToList(); 
    } 

    return this.Json(
     new 
     { 
      Result = (from obj in defaultRateCharts select new { Id = obj.Id, DialPrefix = obj.NumberPrefix, Rate = obj.PurchaseRates }) 
     } 
     , JsonRequestBehavior.AllowGet 
    ); 
} 

und ich nicht jetzt, dass die Fehlermeldung erhalten, aber wie kann ich die Sammlung in Ajax-Erfolg analysieren. Ich änderte den Erfolg zu Folge, aber es fügt keine Zeilen in der Tabelle hinzu.

success: function (data) { 
      var row = $('<tr>'); 
      for(var i = 0; i < data.length; i++) { 
       row.append($('<td>').html(data[i])); 
      } 

      $('#results').append(row);          
      jQuery('#RecordingRates').dialog({ closeOnEscape: false }); 
      $(".ui-dialog-titlebar").hide(); 
      $("#RecordingRates").dialog({ dialogClass: 'transparent' }); 
      $('#RecordingRates').dialog('open'); 
      } 
    }); 

In Firebug Net => XHR => Json, zeigt es JSON folgende:

[Object { Id= 

1 

, DialPrefix= 

"1" 

, Rate= 

2.6 

}, Object { Id= 

3 

, DialPrefix= 

"2" 

, Rate= 

2.6 

}, Object { Id= 

5 

, DialPrefix= 

"7" 

, Rate= 

3.5 

}, 3 more...] 


0 
    Object { Id= 

1 

, DialPrefix= 

"1" 

, Rate= 

2.6 

} 

1 
    Object { Id= 

3 

, DialPrefix= 

"2" 

, Rate= 

2.6 

} 

2 
    Object { Id= 

5 

, DialPrefix= 

"7" 

, Rate= 

3.5 

} 

3 
    Object { Id= 

7 

, DialPrefix= 

"8" 

, Rate= 

6 

} 

4 
    Object { Id= 

9 

, DialPrefix= 

"Default" 

, Rate= 

5 

} 

5 
    Object { Id= 

15 

, DialPrefix= 

"Subscription" 

, Rate= 

15 

} 
+0

Haben Sie versucht, hart codierte Werte für 'DefaultRateChart' und Entfernen des' using' Teil vorübergehend? Macht keinen Sinn, das zu tun, aber es ist ein guter Weg, um das Problem zu isolieren. –

+0

@vonv. Bitte sehen Sie die Updates – DotnetSparrow

+0

Ist dies eine Art neue Methode zu schreiben oder habe ich Recht, Sie schließen nicht die tr und die TDs. Was bekommst du, wenn du Dinge inspizierst? –

Antwort

0

wie kann ich die Sammlung in Ajax-Erfolg analysieren. Ich änderte Erfolg zu folgend, aber es fügt keine Reihen in der Tabelle hinzu.

Sie kehren eine Sammlung mit den folgenden Feldern: Id, DialPrefix, Rate, und Sie sind nicht mit ihnen.

var row = $('<tr>'); 
for(var i = 0; i < data.length; i++) { 
    row.append($('<td>').html(data[i])); 
} 

$('#results').append(row); 

Sie müssen sie Ihre Schleife hinzuzufügen:

row.append($('<td>').html(data[i].DialPrefix)); 
row.append($('<td>').html(data[i].Rate)); 
+0

Ich benutze dies, aber es erscheint immer noch nicht in der Tabelle .. – DotnetSparrow

+0

Haben Sie überprüft, dass Sie tatsächlich Daten haben? Versuchen Sie, in der Konsole zu drucken ('console.log (data)'). –

+0

Ich zeigte Alarm und es sagt Objekt Objekt – DotnetSparrow

4

Dies geschieht, wenn zwei oder mehr Objekte in Ihrem JSON Punkte zueinander, der Serializer nicht in solche reflektieren JSON. Sie sollten den Newtonsoft Serializer verwenden (Es wird hier erklärt, wie es geht: Using JSON.NET as the default JSON serializer in ASP.NET MVC 3 - is it possible?)

Es gibt mehrere Dinge, die Sie tun können. Die erste war eine ist lassen Sie den Konfigurationsmanager wie folgt diese Verweise zu ignorieren oder zu bewahren wissen:

 config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
     config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None; 

oder

können Sie die Eigenschaften mit Anmerkungen versehen Sie wollen nicht in den Objekten serialisiert werden (also ein Zirkelverweis wird nicht existieren). Mit der Anmerkung [JsonIgnore] wie folgt aus:

public class Order 
{ 
    [JsonIgnore] 
    public virtual ICollection<OrderLines> OrderLines{ get; set; } 
} 
+0

Danke für die Antwort. Bitte beachte die bearbeitete Frage. Ich muss diese Sammlung/json verwenden, um Zeilen in der Tabelle hinzuzufügen – DotnetSparrow

+0

Dies ist nicht der Fall, obwohl in MVC 3. –

+0

Ok, stimmt meine Antwort nicht mit der Frage sowieso, da die Frage bearbeitet wurde. –

Verwandte Themen