2011-06-21 13 views
6

私はここで何か信じられないほど紛らわしいことはないが、モデルバインダーがコレクションから継承するビューモデルを常にバインドするのに何らかの理由があるのだろうか?MVC3剃刀モデルのバインダーと継承されたコレクション

私はページリストを表示し、コンボボックスを表示し、その上にボタンを追加したいとします(単純なリストを扱う)。その後、

public class PagedList<T> : List<T> 
{ 
    public int TotalCount { get; set; } 
} 

とビューのように見えるモデル::だからビューで

public class MyViewModel : PagedList<ConcreteModel> 
{ 
    public IEnumerable<ChildModel> List { get; set; } 
    public int? SelectedChildModelId { get; set; } 
} 

(レイザー):

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(model => model.SelectedChildModelId, new SelectList(Model.List, "ChildModelId", "DisplayName")) 
} 

とコントローラHttpPost行動を伴ったクラスは、次のようになります。

public ActionResult(MyViewModel viewModel) 
{ 
    ... 
} 

上記はc ActionResultのviewModelをnullにする。それについて論理的な説明はありますか?コレクションから継承したモデルを表示することだけが具体的であると私は言うことができます。

私はカスタムバインダーでそれを回すことができますが、関連するプロパティはプリミティブ型であり、ジェネリックまたは継承もありません。

コレクションの継承された型をプロパティとして持つようにビューモデルを修正し、問題を修正しました。しかし、私はバインダーがそれに壊れている理由を私の頭をまだ傷つけています。建設的な考えは高く評価されました。

+0

これまで、コレクション継承型のプロパティを宣言しているビューモデルではなく、他の実行可能な解決策が見つからなかったため、継承したビューモデルを使用しました。私がこのアプローチで持っている唯一の問題は、オートマップの代わりにプロパティを明示的に設定する必要があるため、AutoMapperの作業が複雑になることです。 –

+0

[Stack Overlow]の回答(http://stackoverflow.com/questions/5762302/why-cant-my-views-model-bind-with-my-generic-viewmodel-which-implements-an-inte)が見えます有望。うーん、共変量 - 前にそれを使用したことはありません –

答えて

0

フォームポストのデータのフォーマットが異なると、コレクションへのモデルバインディングがより効果的に動作することがあります。

私は、postifyと呼ばれるプラグインを使用します。

http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/

+1

ありがとうDevin。確かに興味深いプラグインですが、この場合はjavascriptと何も関係ありません。通常、私はすべてのWebアプリケーションをJavaScriptなしで動作させ、拡張としてのみ使用します。この場合、MVC3が提供するバインダーの問題は、コレクションモデルの投稿を処理する方法を知らないことです。私が探していたのは、ビューモデルを構造化するか、または正しいベースコレクションから継承する方法で、それが正しくバインドされているということです。 –

1

自分の質問に答えるために:もはや一般的なリストまたは類似の継承ではなく、必要なコレクション型のプロパティを持つコレクションを行わないために何かを持っているすべての私のモデルを。レンダリング時にあなたが

@Html.EditorFor(m => m.CollectionProperty) 

を使用して、含まれているタイプのビュー/共有/ EditorTemplates下のカスタムエディタを作成することができますので、これは非常にうまく機能します。コレクションからの個々のアイテムはすべてインデックスを取得し、バインダーはサブミット時に自動的にバインドできるため、モデルバインダーでもうまく動作します。

レッスンで学んだこと:ビューでモデルを使用する予定の場合は、コレクションタイプを継承しないでください。

関連する問題