2012-04-27 21 views
4

DisplayForEditorForに渡される式は、データアクセスにモデルを使用する必要がありますか?私は何かを持っているかもしれませんが、DisplayFor/EditorForでデータアクセスにモデルを使用する必要がありますか?

@Html.DisplayFor(m => m.Subs[i].Name) 

または:

例えば、私は、モデルで始まるフルパスを使用して、私のビューのデータへのアクセスを書くことができ、次のモデル

class MyModel { 
    IList<SubModel> Subs { get; set; } 
} 
class SubModel { 
    string Name { get; set; } 
} 

ている場合がありますこのように、モデルを使用しないビュー内で:

@foreach (var item in Model.Subs) { 
    @Html.DisplayFor(m => item.Name) 
} 

しかし、上記の私は実際にモデルを使用していません。これは私が試したたびにうまくいったようですが、どのような条件下で問題にぶつかるのでしょうか?

EditorForは通常、フォーム要素に名前/ IDを作成するためにExpressionを使用します。 EditorForに渡される式を指定するときに、モデルを使用しないことは今までに安全ですか?

+0

'Html.DisplayFor(m => m.Subs)'は、(テンプレート名を指定しない限り)コレクションの各項目の 'SubModel'テンプレートをレンダリングすることを知っています。 、 右?では、一般的に、フォームに任意の数の要素があり、リストにバインドする必要があるシナリオについて話していますか? –

+1

はい、良い点。表示テンプレート(またはエディタテンプレート)を使用して子オブジェクトをレンダリングしていない場合や、ユーザーが何らかの形で関心のあるレコードのサブセットを特定している場合は、私のオプションが何であるかを知りたいと思います。 –

答えて

1

簡単な答えはあります - ラムダメソッドに引数として渡すモデルがなければなりません。ビューにモデルがなく、DisplayForまたはEditorForを呼び出すと、「テンプレートは、フィールドアクセス、プロパティアクセス、1次元配列インデックス、または単一パラメータカスタムインデクサ式でのみ使用できます」というエラーメッセージが表示されます。

DisplayForを使用するにはモデルが必要ですが、実際には使用する必要はありません。たとえば、これを行うことができます:

Html.EditorFor(m => i) 

この場合、HTMLの名前とIDは両方とも "i"になります。

しかし、注意すべき点がいくつかあります。たとえば、Shared/Display TemplatesまたはEditor Templatesフォルダに、SubModelのための強く型付けされた部分的なビューを作成することができます。この場合、DisplayForでforeachを使用することができます。

あなたがEditorForを使用していて、戻っモデルにバインドするために掲示場にしたい場合は、あなたが使用する必要があります:

for (i = 0; ...) 

ではなく、foreachのあなたのHTMLフォームのフィールドは、このようなバインド可能な名前で終わるように、 Subs [1] .Nameとして。あなたはforeachのを使用している場合は、すべての入力は、例えば、同じ名前とIDを持つことになります。

id="s_Name" name="s.Name" 

forループを持つのに対し、あなたが得る:forループ

id="SubModels_0__Name" name="SubModels[0].Name" 

ザ・法的なHTML(固有のIDを生成し)、サーバー上のリストにリバウンドすることができます。

明確にする:EditorForまたはDisplayForを使用するときは、2つの注意すべき事項があります。まず、渡す式が、Html要素に使用されるフィールド名を決定します。式がモデルに関連する場合、名前は上の例に示すようにモデルから派生します。私はモデルにサブクラスにバインドされたのであれば:

Html.DisplayFor(m => m.Submodel.Name) 

HTMLフィールド名が「Submodel.Name」になり、それは同じ階層にポストバックに再バインドされます(あなたはまた、使用して名前を自分で設定できることに注意してくださいオーバーロードされたメソッドの1つ)。

第2の側面は、式が型指定されていることです(つまり、CLR型またはカスタム型のいずれかに解決されます)。その型をレンダリングするために、MVCはモデルが一致するテンプレートを探します。現在のViewフォルダ、次にSharedフォルダから始まるパス階層を使用してテンプレートを検索し、カスタムフォルダが見つからない場合は内部テンプレートに戻ります。

したがって、必要なレンダリングとポストバックのバインディングを実現するには、これらの両方を考慮する必要があります。しかし、データの表示にのみ関心がある場合は、モデルに一致するHtmlフィールド名を心配する必要はなく、任意の名前を使用することも、まったく使用しないこともできます。しかし、HTMLのIDは一意でなければならないことに注意してください。上の例のように、同じIDで終わることができます。現在のブラウザの作物はそれに問題はないようですが、あなたがidで選択するためにJavascriptを使いたいのであれば面白いでしょう。

+0

簡単に言い換えようとしています:どの条件の下で、それらに渡されるラムダ内のモデルを参照せずに、 'EditorFor'または' DisplayFor'を使用できますか? –

+0

これらのメソッドは、ラムダ式にモデルを渡しても、何でも使用できます。必要に応じてモデルを無視することができます。たとえば、:Html.DisplayFor(m => i) –

+0

つまり、 'DisplayFor'と' EditorFor'メソッドはいつでも使用できますが、IDと名前がPOSTで生成されているモデルのものと一致しない限り、モデルバインダーはモデルを適切に作成できるか?もしそうなら、投稿を編集して明確にしてください。私は同意します。文書の参考文献は特に評価されるだろう。 –

関連する問題