2011-02-11 31 views
3

モデル:フォームとリストとのMVC 3:デフォルトモデルバインダーとEditorFor

public class MyObject 
{ 
    public IList<Entry> Entries; 
} 

public class Entry 
{ 
    public string Name { get; set; } 
} 

IデフォルトEditorFor(モデル=> model.Entries)を使用する場合名/ ID値は次のとおり

<input type="text" value="" name="Entries[0].Name" id="Entries_0__Name"> 

代わりに私はこのようなEditorForテンプレートを作成する場合:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<CMS.Models.MyObject>>" %> 

<div class="list"> 
<% 
    for (int i = 0; i < Model.Count; i++) 
    { %> 
    <div class="object" id="<%: i %>"> 
     <%: Html.EditorFor(model => Model[i]) %> 
     <%: Html.ValidationMessageFor(model => Model[i]) %> 
    </div> 
<% } %> 
</div> 

放出される名前/ ID値は次のとおりです。

<input type="text" value="" name="Entries.[0].Name" id="Entries__0__Name"> 

したがって、名前にはプロパティ名と[0]の間にピリオドがあり、idにはインデックス番号の左に余分なアンダースコアが付きます。これはデフォルトのモデルバインダーでは機能しません。デフォルトのモデルバインダーで動作する方法はありますか?

+1

なぜこれをやりたいですか?検証メッセージが含まれているかどうか、IDタグが設定されたdivタグが必要なのですか? –

+0

リストの最後にジェネリックjQueryベースの「追加」オプションを追加して、別の要素を追加できるようにしています。そのHTMLでリストを出力することで、 "add"ジェネリックをもっと簡単に作成できます。 1つのセクションがN個の参照を必要とするフォームを考えてください(各参照は複数のプロパティを持っています)、別の部分は他のものに関するN個の詳細を必要とします(各部分は複数のプロパティを持っています)... – Cymen

答えて

3

私はあなたがモデルバインダーに問題を引き起こしているように思われる、リストを明示的に反復することなく、テンプレートを使用してこれを行うことができると思います。

MyObjectにエディタテンプレート

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CMS.Models.MyObject>" %> 

<div class="list"> 
    <%: Html.EditorFor(m => m.Entries) %> 
</div> 

入力エディタテンプレート

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CMS.Models.Entry>" %> 

<div class="object" id="<%: ??? %>"> 
    <%: Html.EditorFor(m => m.Name) %> 
    <%: Html.ValidationMessageFor(m => m.Name) %> 
</div> 

私はまだIS考え出したていない唯一のもの:

は、これらの共有エディタのテンプレートを作ってみましょうdivのid属性で正しい値を取得する方法、したがってクエスチョン。最終的な注意点は、私は自宅にいるので、実際にはこれを試していないということです。

+0

これはうまくいきました。私が必要としたことを達成する。私はそれが実際には無効なHTMLだと思う(複数のリストを持っている場合は重複したIDを持つことができる)ので、このように最後に!ありがとう! – Cymen

+0

嬉しい、私は助けることができてうれしい! –

+0

最も役立ち、きれいで簡単です。ありがとう! – Menahem

関連する問題