2011-08-14 34 views
5

Denetleyicimin eylemi için etkili bir nesne sözlüğünü gönderen bir form var. AncakNeden asp.net mvc model binder üreten system.string []

[1] "Attributes[0].Name" string 
    [2] "Attributes[0].Value" string 
    [3] "Attributes[1].Name" string 
    [4] "Attributes[1].Value" string 
    [5] "Attributes[2].Name" string 
    [6] "Attributes[2].Value" string 

, ben birinin değeri almak için bir girişim çalıştığımda: Ben beklemek olacağını görmek Request.Form topluluğu baktığımızda yüzden bir IEnumerable<EditThemeAttributeModel>

 public class EditThemeAttributeModel 
     { 
      public string Name { get; set; } 
      public object Value { get; set; } 
     } 

olsun EditThemeAttributeModel ben beklediğiniz gibi basit bir türü değil, bir dize dizisi var:

- Value {string[1]} object {string[]} 
       [0] "#ffffff" string 

doğrudan Request.Forms koleksiyonunu kullanarak bu çalışabilirsiniz, ama sadece under istedi Bu davranışı tandır.

cevap

4

http isteklerinin tüm gönderileri varsayılan olarak dizelerdir. Yazılan bir nesne yerine bir nesneyi referansladığınızdan, varsayılan olarak dizeden geçtiği için tarayıcıdan gelen veri bir dizedir. Bir dize olmamasını istiyorsanız, nesneyi yazmanızı öneririm veya EditThemeAttributeModel için kendi model binderinizi oluşturabilirsiniz.

+0

evet bunu biliyorum, ama soru bu değildi. Soru şu ki, model bağlayıcı bir nesne dizisi geçirdiğimizde dize dizisi dizgisi [] dizisi üretir. –

+2

Çünkü varsayılan olarak, belirli bir gönderi değeri için aynı ada sahip birden çok değer ekleyebilirsiniz. 'id = 1 & id = 2 & id = 3', özellikle bir' string' değil '' object' '' için sormadığınız için model binder bir dizi olabileceğini varsayar, çünkü doğrudan bir türe dönüştüremez. Dizi yaratımı, model bağlayıcısının son çağrısıdır çünkü temel olarak gerçekte ne istediğinizi anlayamadık. Güvende olmak için bunu yapıyordum. – Buildstarted

+0

Model bağlayıcı kodunu kaynakta takip edebilir ve neden yaptığını tam olarak nasıl yaptığını görebilirsiniz. Otomatik bir model ciltleyici oluştururken yaptığım benzer bir soruya cevap vermek için bunu bir süre önce yaptım. http://aspnet.codeplex.com/SourceControl/changeset/view/68345#266460 'BindSimpleModel''e bakın (gerçek dönüşüm ValueProviderResult’dadır) – Buildstarted

İlgili konular