これは、フレームワークがどのようにして必要なものの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
を吐き出しており、バインディングは失敗します。
私はいくつかの回避策を考えることができます:
- は
- 特化したカスタムモデルバインダーを書くことは知らなくても
item
モデルを取得しますので、それは財産 - だ、独自の型指定されたエディタに全体の気のフォームを入れてビューモデルを終了し、
ViewData
辞書を使用してドロップダウンをハックします HtmlHelpers
を終了し、フォーム全体を手書きします- ラムダとをパラメータとする独自の
HtmlHelper
拡張を書きます。 - すべてのラベル/フィールドグループを個々のエディタテンプレートに入れます。
これらのすべては、過剰殺戮または怠惰のように感じます。ビューモデルはきれいで便利なアプローチです。それらを使用することは、私が他の分野で怠け者であるか、またはフレームワークのかなりの部分に小さなバリエーションを再現しなければならないことを意味しますか?私は最後の3ヶ月(CSのバックグラウンドなしで地獄の静的な入力が何かを知るために試みているグラフィックデザイナー)にC#を教えました。私は孤立して働く。ベストプラクティスを学ぶ者は誰もいません。私はそれらのいくつかを学ぶことができない場合、私は維持できない糞のヒープで終わるように感じる。だからあなたの意見は高く評価されます。
Daniel! –