Une référence circulaire a été détectée lors de la sérialisation d'un objet de type 'Système.Réflexion

j'ai une asp.net MVC 3 méthode d'action du contrôleur comme ceci:

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

je veux envoyer cette liste à la méthode de succès jquery ajax mais je reçois 500 Erreur De Serveur Interne

mon appel ajax est comme ceci:

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

dans firebug XHR sous l'onglet response, il est écrit:

une référence circulaire a été détectée lors de la sérialisation d'un objet du système de type'.Réflexion.RuntimeModule".

[EDIT]

je modification de la méthode d'action:

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

et je n'obtiens cette erreur maintenant, mais comment puis-je analyser la collection en ajax succès. J'ai changé le succès à suivre mais ce n'est pas ajouter des lignes dans le tableau.

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

Dans Firebug Net => XHR=> Json, Il montre JSON suivants:

[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

}
10
demandé sur Dan Homola 2013-04-29 17:07:43

2 réponses

Comment puis-je analyser la collection dans ajax succès. J'ai changé le succès de mais il ne s'agit pas d'ajouter des lignes dans le tableau.

vous retournez une collection avec les champs suivants: Id, DialPrefix,Rate, et vous ne les utilisez pas.

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

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

Vous devez les ajouter à votre boucle:

row.append($('<td>').html(data[i].DialPrefix));
row.append($('<td>').html(data[i].Rate));
0
répondu von v. 2013-04-29 13:49:51

cela se produit lorsque deux ou plusieurs objets dans votre JSON pointent l'un vers l'autre, le sérialiseur ne peut pas les refléter dans JSON. Vous devez utiliser le Newtonsoft sérialiseur (C'est expliqué ici comment faire: en utilisant JSON.NET comme le serializer JSON par défaut dans ASP.NET MVC 3-est-ce possible?)

Il y a plusieurs choses que vous pouvez faire. La première était de faire savoir au gestionnaire de configuration d'ignorer ou de préserver ces références comme ceci:

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

ou

vous pouvez annoter les propriétés que vous ne voulez pas sérialiser dans les objets (donc une référence circulaire n'existera pas). Avec l'annotation [JsonIgnore] comme ceci:

public class Order
{
    [JsonIgnore]
    public virtual ICollection<OrderLines> OrderLines{ get; set; } 
}
4
répondu Nick N. 2017-05-23 12:16:38