2012-04-01 10 views
2

アクションメソッドのパラメータに正しくバインドするために、いくつかの隠しフィールドをフォーマットするために2つの驚くほど不満な時間を費やしただけです - 私は先週この経験を2度持っていました - なぜ今MVCアーキテクトが選んだのかそれらがオブジェクトのリスト(および辞書)に対して行った特定のバインディング規則。ASPNET MVC:なぜこのアクションメソッドバインディング条項?

ここでは、デフォルトのバインディングエンジンで予想される形式について痛感して理解しています。私の例では、私はCustomClassタイプがPropertyName意味と呼ばれるパブリックプロパティを公開一覧にバインドする:1が定義されている場合

<input type="hidden" name="prefix[idx].PropertyName" value="PropertyName[idx] Value" /> 

プレフィックスは、ViewDataDictionary.TemplateInfo.HtmlPrefixあります。

インデックス情報([idx]ピース)を使用して何かへの参照を開始するのは、直感的に直感的です。私はまた、このコンストラクト内のどこにも、私がバインドしているアクションメソッドのパラメータの名前を参照していないことに気をつけています。それは原始的なモデルのプロパティ、たとえば、と何が起こるかとは正反対であるように思わ:

<input type="hidden" name="Text" value="something" /> 

public ActionResult SomeActionMethod(string Text)... 

私はMVCで私自身のモデルバインダーをロールバックすることができます理解しています。それは私の時間の有益な使用のようには見えませんが、隠れたフィールドの正しいフォーマットを困惑させようと時間を費やしてもどちらも利益がありません:)そう、多分私はそれを試みます。また、@ Html.HiddenFor()を使用して型テンプレートを作成し、CustomClassのインスタンスをモデルとして、単一行の@Htmlを持つ単純な部分的なビューを通して、CustomClassのインスタンスを出力することによって、MVCにすべての重労働をさせることもできます。 DisplayForModel()。しかし、それはあまりにも長い間、納屋の周りに行くようです。また、@ Html.Hidden( "fieldname"、value)を書くことで値が終了することは保証されないので、@ Html.Hiddenヘルパーを使うことには限界があります代わりにキャッシュに古い値が表示されることがあります(今日はもう1時間の煩わしさでした)。

しかし、私は主にこのフォーマットが選択された理由が不思議です。より多くのなぜない何かC/C++/C#/ VBのような:

<input name="prefix.ParameterName.PropertyName[idx]" /> 

編集:私は私の例ではインデックスパラメータを置く場所に

良い点。あなたが正しいです、プロパティはインデックスされていません、含まれているクラスです。

ただし、基本的な状況は変わりません。以下のような構文ものではありません理由:

<input name="prefix.ParameterName[0].PropertyName" /> 

標準構文は、カスタムタイプのコレクションをパラメータ名を無視し、「推測」プロパティ名からカスタムタイプ。それは奇妙です...だから、その背後には物語や選択がなければなりません:)。

+0

申し訳ありませんが、これは間違った質問ですが、 "ViewDataDictionary.TemplateInfo.HtmlPrefix"の意味を明確にすることはできますか? – McGarnagle

+0

@dbaseman - HtmlPrefixは、テンプレートがコレクションにバインドされているときに名前フィールドの書式を正しく設定できるようにするものです。 –

答えて

0

実際、完全に意味があります。インデックスはコレクション内であり、プロパティではありません。 PropertyNameのコレクションがなく、CollectionName []に​​PropertyNameを持つコレクションがあります。

public class Foo { public string Bar { get; set; } } 

var foos = List<Foo>(); 

for (var i = 0; i < foos.Length; i++) 
{ 
    var prop = foos[i].Bar; // This is the important bit 
} 

モデルバインダーで起こるまさにです:この別の言い方をすると

モデルバインダーはポスト値を逆シリアル化するときに、値を挿入するコレクションを知っていなければなりません。また、各アイテムのインデックスを知る必要があります。したがって、Foosのコレクション、x個のアイテム、および各Barが関連付けられているインデックスを作成することを知っておく必要があります。

+0

詳細についてはhttp://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx –

+0

リンクをありがとう、Erik。私の編集で説明しようとしたので、記事は私の基本的な質問に答えるとは思わない。私は標準バインディングがバインダーがどのようにモデルクラスを扱うかの人工物ではないのだろうか?これでバインダーが見つからないことを意味します: バインディング時に ターゲットタイプがモデルであると仮定することによって、必要な冗長性を削減します。おそらく、MVCチームはモデルクラスのバインダーを別のものを作成するのではなく、単にリサイクルしているのかもしれません。 –

関連する問題