2011-01-28 8 views
3

これは、フレームワークがどのようにして必要なものの95%をうまく処理するのかという話ですが、最後の5%で不当に眉をひそめます。非標準のマラキーに参加したい場合は、自分のビジネスであることを伝えてください、ありがとうございます。あなたが良いことをやり遂げることに戻ることにしたければ、ここにいるでしょう。一般的に言えば、この最後の5%には必須の機能のいくつかのバージョンが含まれることは避けられません。ASP.Net MVC 2:ビューモデルを使用するとモデルバインディングが破棄されます

私はデータオブジェクトを更新する強く型付けされたビューを持っています。私は慣用のMVC2ヘルパーを使用しました。たとえばHtml.TextBoxFor(model = > model.Name)です。私はネストされたオブジェクトのためにエディタテンプレートを使用しました。 (私のバックエンドはMongoドキュメントの集まりなので、複雑な型を表現する必要があります)。

次に、ドロップダウンが必要です。ドロップダウンはちょっと厄介です。何の問題、私は直接itemに渡す代わりのviewmodelを作ります:

class itemViewModel 
{ 
    ... 
    public Item item { get; set; } 
    public IEnumerable<SelectListItem> dropdown { get; set; } 
} 

public ActionResult() 
{ 
    return View("Update", new itemViewModel(item, dropdown)) 
} 

...正常に動作し、ドロップダウンを移入しません。しかし!私の考えは更新が必要です:

Html.TextBoxFor(model => model.Name) -> 
Html.TextBoxFor(model => model.item.Name) 

素晴らしい、問題解決。私のモデルバインディングは機能しません。私はデバッグし、Request.Form値を見てください:ああ。 Nameの代わりにitem.Nameとなります。意味をなさない代わりにitemViewModelが必要になると私の更新ビューに伝え、バインディングが機能します。

ああ待ってません。なぜなら私はエディタを使用するオブジェクトを入れ子にしているからです。それらは強く型付けされており、受け取っているモデルが実際にビューモデルのプロパティであることを知らない。だから彼らはまだitem.Address.Cityの代わりにAddress.Cityを吐き出しており、バインディングは失敗します。

私はいくつかの回避策を考えることができます:

  1. 特化したカスタムモデルバインダーを書くことは知らなくてもitemモデルを取得しますので、それは財産
  2. だ、独自の型指定されたエディタに全体の気のフォームを入れてビューモデルを終了し、ViewData辞書を使用してドロップダウンをハックします
  3. HtmlHelpersを終了し、フォーム全体を手書きします
  4. ラムダをパラメータとする独自のHtmlHelper拡張を書きます。
  5. すべてのラベル/フィールドグループを個々のエディタテンプレートに入れます。

これらのすべては、過剰殺戮または怠惰のように感じます。ビューモデルはきれいで便利なアプローチです。それらを使用することは、私が他の分野で怠け者であるか、またはフレームワークのかなりの部分に小さなバリエーションを再現しなければならないことを意味しますか?私は最後の3ヶ月(CSのバックグラウンドなしで地獄の静的な入力が何かを知るために試みているグラフィックデザイナー)にC#を教えました。私は孤立して働く。ベストプラクティスを学ぶ者は誰もいません。私はそれらのいくつかを学ぶことができない場合、私は維持できない糞のヒープで終わるように感じる。だからあなたの意見は高く評価されます。

答えて

8

Sigh。カップルよりグーグルの時間と暗闇の中でいくつかのショット、そしてBind属性を使用して、これを行うための信じられないほど簡単な方法があることが表示されます。

[HttpPost] 
public ActionResult([Bind(Prefix="item")] item) 
{ 
    //item's complex types populate correctly 
} 

属性がに到達するのに十分にスマートであると思われます複合型。

私はこれを私の無知に対する賛辞として残し、他の不運なn00bが私よりも速く答えを見つけることを望んでいます。

+0

Daniel! –

-9

ダニエル、まず、私はあなたの努力を表明し、.NET、C#、およびASP.NET MVCを1つの大きな咬合で賞賛すると言っています。さて、あなたは挫折し、私はそれに関連しています。それは今、私たちすべてに起こります。

私は、ASP.NET MVC(Problems with ASP.NET MVC Framework Design)のファンではありません(実際には少しでもありません)ので、あなたの問題に対する解決策を教えていただけません。しかし、ここに私があなたがいる状況を見てほしいです:

あなたは迷路にいるとあなたはどこかに間違ったターンをした、あなたは迷路にもっと深く行くんだけど道を見つけるつもりはありません。だからあなたがしなければならないことは、間違った方向に戻って別のルートがあるかどうかを見ることです。だからあなたがいる場所から始めて、あなたが作ったすべてのステップ/チェンジのためになぜ「なぜ」を尋ね、一度に1ステップずつバックアップをしてください。それは理にかなっていますか?あなたは最終的に同じ(元の)問題に取り組むための他の代替方法を持っているところまで行きます。

+2

-1。説教とASP.Net MVCの否定的なものに焦点を当て、問題を解決するために役立つではなく、陽性。 – Pradeep

関連する問題