2011-08-14 2 views
5

私はコントローラのアクションに対してオブジェクト辞書を効果的に掲示しているフォームを持っています。しかしなぜasp.net mvcモデルのバインダーは、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 

、Iのいずれかの値を取得しようとする試みをしようとすると:私は私が期待するものを見るRequest.Formコレクションを見てみるとだから我々はIEnumerable<EditThemeAttributeModel>

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

を取得しますEditThemeAttributeModel私が期待するような単純なタイプではありませんが、それは文字列の配列です:

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

は、私が直接Request.Formsコレクションを使用することによってこの問題を回避することができますが、ちょうどアンダーに望んでいましたこの動作をします。

答えて

4

httpリクエストからのすべての投稿は、デフォルトでは文字列です。型付きオブジェクトではなくオブジェクトを参照しているので、ブラウザからのデータが文字列であるため、デフォルトでstringになります。それが文字列ではないようにするには、オブジェクトを入力するか、EditThemeAttributeModel用の独自のモデルバインダーを作成することをお勧めします。

+0

はい私はそれを知っていますが、それは問題ではありませんでした。問題は、なぜモデルバインダーがオブジェクトのコレクションを渡すときに文字列配列 'string []'を生成するのかということです。 –

+2

デフォルトでは、指定されたポスト値に同じ名前の複数の値を含めることができるためです。モデルバインダーは 'string'を要求するのではなく、' object'を要求しているので 'id = 1&id = 2&id = 3'です。配列の作成は、モデルバインダーの最後の呼び出しです。なぜなら、基本的には、実際に望んでいたものが分からないからです。私はそれが安全であるためにこれをやっていることを集めるだろう。 – Buildstarted

+0

ソースのモデルバインダーコードに従って、それが何をしているのか正確に知ることができます。自動モデルバインダーを作成するときに私が持っていたのと同じ質問に答えるために、これをしばらくやりました。 http://aspnet.codeplex.com/SourceControl/changeset/view/68345#266460 'BindSimpleModel'を見てください(実際の変換はValueProviderResultにあります) – Buildstarted

関連する問題