2009-08-12 11 views
17

Bir ASP.NET MVC uygulaması geliştirirken, JsonResult eylemlerimin bir istisna attığı birkaç yer buluyorum "Bir nesneyi serileştirirken dairesel bir referans tespit edildi". ŞimdilikASP.NET MVC'de JSON serileştirmesini nasıl önleyebilirim?

, ben söz konusu referansları kaldırarak değilim, ama JSON serileştirici bunu göz ardı eder, öyle ki mülk basitçe işaretlemek için ideal ben istiyorum.

Bunu nasıl yapabileceğimi öneren var mı?

+0

Hangi serileştirici kullanıyorsunuz? –

+0

JsonResult benim dönüş türüm, bu yüzden ASP.NET MVC 1.0'ın denetleyici sınıfında varsayılan olan serializer'ı kabul ediyorum. – JMP

+0

JavaScriptSerializer nedir. – womp

cevap

28

[ScriptIgnore]sizin için çalışmalıdır.

+2

Bu, bir JsonResult'un JavaScriptSerializer'ı dahili olarak kullanması nedeniyle çalışmalıdır. – womp

+3

Diğerlerine not: Bunu en azından .NET 4. – Jacob

+4

System.Web.Script.Serialization.ScriptIgnore –

13

Genellikle kompleks için sadece geçici bir 'İnbetween' nesnesi oluşturarak seri hale getirmek için elinden geleni nesneleri fark ettik: Örneğin

referansları için ben do aşağıdaki. Bunu aslında ASPX model sayfam için codebehind'de yapıyorum.

Bu, güzel bir JSON nesnesi oluşturur. Modelimi yeniden düzenleyebileceğimi fark edeceksiniz ve sayfa hala çalışmaya devam edecektir. Veri modeli ile sayfa arasındaki sadece bir başka soyutlama katmanı. Denetleyicimin JSON'u olabildiğince çok bilmesi gerektiğini düşünmüyorum ama ASPX 'codebehind' kesinlikle yapabilir. Benim ASPX olarak

/// <summary> 
/// Get JSON for testimonials 
/// </summary> 
public string TestimonialsJSON 
{ 
    get 
    { 
     return Model.Testimonials.Select(
      x => new 
      { 
       testimonial = x.TestimonialText, 
       name = x.name 
      } 
      ).ToJSON(); 
    } 
} 

Ben sadece bir blok içinde bunu:

var testimonials = <%= TestimonialsJSON %>; 

// oh and ToJSON() is an extension method 
public static class ObjectExtensions 
{ 
    public static string ToJSON(this Object obj) 
    { 
     return new JavaScriptSerializer().Serialize(obj); 
    } 
} 

bunu getirmek ... Bu öneriye karşı tepki hazırım ...

Ben Veriye erişemiyorum, sadece Görünüm için bir modeli yeniden biçimlendirmek. Bu 'görünüm modeli' mantığı, 'denetleyici modeli' mantığı değil.

+2

+ 1 sürümünde kullanıma sunmak için System.Web.Extensions derlemesine bir başvuru eklemeniz gerekebilir. İlk başta, "Birden çok model yaratmak istemiyorum" diye bir tepki vermek istedim, ama bana biraz mantıklı gelmeye başlayan "görüş modelinden" bahsetmiştiniz: iş mantığı için modeller yapıyorsunuz, neden görünüm için model yapmıyorsunuz? mantık? Parlak! Benim özel durumumun cevabı değil, ama def değerinde bir değer. – JMP

+0

Ben de birden çok model oluşturmak istemiyorum! Bu, başka bir sınıf yaratmak zorunda kalmadan bunu yapmanın en kolay yoludur (burada gereksiz). model veri ve sadece veriler, verilerin nasıl gösterileceği değil, her zaman pratik olmasa da, görünümün farklı bir teknolojiye dönüştüğü veya birden çok farklı görünüm sağlamanız gerektiğinde, görünüm ve model arasındaki bağlantıyı her zaman en aza indirmelisiniz (ajax)./flash/plain html) –

+0

Bu yaklaşımı, aynı temel modelden birkaç farklı JSON serileştirmesine ihtiyaç duyabileceğiniz durumlarda beğeniyorum. –

2

JSON.NET numaralı telefonu kullanmasını öneririm. Dairesel referansları serileştirmeyi ve daha fazla serileştirme seçeneği sunmayı sağlar.

2

Simon ne dedi. Kod ağırlığını kontrol altında tutmak için biraz AutoMapper eylemi ekleyin.

1

i buldum en temiz yaklaşım seri hale getirmek istediğiniz özellikleri sınıfı ve [DataMember] ürününde [DataContract] bir arada kullanmaktır. DataContract özniteliği, DataMember özniteliğine sahip olmayan herhangi bir özelliği yok saymak için çeşitli serileştiricilere bildirir.

ScriptIgnoreAttribute'u kullanmanın iki önemli avantajı vardır. İlk olarak, System.Web.Extensions derlemesine bağımlılığı yoktur. İkincisi, sadece JSON değil, diğer serileştirme türleri ile çalışır. Örneğin, MVC 4'te yeni Web API'sini kullanıyorsanız, DataContract/DataMember yaklaşımı XML serializer ile de çalışır.

Varlıklarınızın paylaşılan bir kitaplıkta depolandığı ve çeşitli projelerde yeniden kullanılacağı senaryoyu düşünün - System.Web.Extensions bağımlılığını istemezsiniz ve serileştirme kurallarını gevşek bir şekilde tanımlamak istersiniz. JSON, XML, vb

İlgili konular