2013-04-29 33 views
10

Ho un MVC 3 metodo azione del controller asp.net simili:Un riferimento circolare rilevato durante la serializzazione di un oggetto di tipo '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); 
} 

desidero inviare questo elenco per metodo successo jquery ajax ma io sono sempre 500 Internal Server Error

mia chiamata AJAX è come questo:

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

In firebug XHR nella scheda di risposta, i t dice:

Un riferimento circolare è stato rilevato durante la serializzazione di un oggetto di tipo 'System.Reflection.RuntimeModule'.

[EDIT]

ho cambiato il metodo di azione a questo:

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 
    ); 
} 

e io non ottenere che l'errore, ma ora come posso analizzare la collezione nel successo Ajax. Ho cambiato il successo in seguito, ma non aggiungo righe nella tabella.

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, Essa mostra segue JSON:

[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

Hai provato codificare i valori per 'DefaultRateChart' e rimuovendo la parte' using' temporaneamente? Potrebbe non avere senso farlo ma è un buon modo per isolare il problema. –

+0

@vonv. Si prega di consultare gli aggiornamenti – DotnetSparrow

+0

Si tratta di una sorta di nuovo metodo per scrivere o ho ragione non si sta chiudendo il tr e il td. Cosa ottieni quando ispezioni le cose. –

risposta

0

come posso analizzare la collezione nel successo Ajax. Ho cambiato il successo in in seguito, ma non aggiungo righe nella tabella.

si restituisce una collezione con i seguenti campi: Id, DialPrefix, Rate, e non sono in uso.

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

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

È necessario aggiungere al vostro ciclo:

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

L'ho usato ma ancora non appare nella tabella .. – DotnetSparrow

+0

Hai controllato che tu abbia effettivamente dati? Prova a stampare nella console ('console.log (dati)'). –

+0

ho mostrato un avviso e dice che l'oggetto oggetto – DotnetSparrow

4

Questo accade quando due o più oggetti in punti JSON per l'altro, il serializzatore non possono riflettere quelle in JSON. Dovresti usare il serializzatore Newtonsoft (qui è spiegato come farlo: Using JSON.NET as the default JSON serializer in ASP.NET MVC 3 - is it possible?)

Ci sono molte cose che puoi fare. Il primo era uno è lasciare che il configuration manager sanno di ignorare o preservare quei riferimenti come questo:

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

o

si potrebbe annotare le proprietà che non si desidera essere serializzato negli oggetti (quindi un riferimento circolare non esisterà). Con l'annotazione [JsonIgnore] in questo modo:

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

Grazie per la risposta. Si prega di vedere la domanda modificata. Ho bisogno di usare questa collezione/json per aggiungere righe nella tabella – DotnetSparrow

+0

Questo non è il caso però in MVC 3. –

+0

Ok, la mia risposta non corrisponde comunque alla domanda, poiché la domanda è stata modificata. –

Problemi correlati