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.
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. –
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
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