2011-08-14 14 views
5

Mam formularz, który publikuje to, co jest efektywnie słownikiem obiektów dla mojej akcji kontrolera. Tak więc otrzymujemy IEnumerable<EditThemeAttributeModel>Dlaczego procesor modelu asp.net mvc produkuje system.string []

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

Kiedy patrzę w kolekcji Request.Form widzę co by się spodziewać:

[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 

Jednak, gdy staram próbę zdobycia wartości jednego z EditThemeAttributeModel nie jest to prosty typ jak bym się spodziewał, że to tablica ciąg:

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

mogę to obejść stosując bezpośrednio kolekcję Request.Forms, ale po prostu chciałem under takie zachowanie.

Odpowiedz

4

Wszystkie posty z żądań http są domyślnie ciągami. Ponieważ odwołujesz się do obiektu, a nie do wpisanego obiektu, domyślnie jest to ciąg znaków, ponieważ dane pochodzące z przeglądarki są ciągami. Jeśli chcesz, aby nie był ciągiem, sugeruję wpisanie obiektu lub utworzenie własnego segregatora dla modelu EditThemeAttributeModel.

+0

Tak, wiem o tym, ale to nie było pytanie. Pytanie brzmi, dlaczego model spoiwa tworzy łańcuch string 'string []', gdy przekazujemy mu kolekcję obiektów. –

+2

Ponieważ domyślnie można podać wiele wartości dla tej samej nazwy dla danej wartości postu. 'id = 1 & id = 2 & id = 3', ponieważ nie pytasz konkretnie o' ciąg', ale 'obiekt', który model zakłada, że ​​może być tablicą, ponieważ nie może przekonwertować go bezpośrednio na typ. Tworzenie tablicy jest ostatnim wywołaniem modelu spoiwa, ponieważ w zasadzie nie było w stanie ustalić, czego naprawdę potrzebujesz. Zrozumiałem, że to robi, żeby być bezpiecznym. – Buildstarted

+0

Możesz śledzić model kodu spoiwa w źródle i zobaczyć, dlaczego dokładnie robi to, co robi. Zrobiłem to jakiś czas temu, aby odpowiedzieć na podobne pytanie, które miałem podczas tworzenia automatycznego segregatora. http://aspnet.codeplex.com/SourceControl/changeset/view/68345#266460 spójrz na 'BindSimpleModel' (rzeczywista konwersja jest w ValueProviderResult) – Buildstarted

Powiązane problemy