モデルバインダーを使用しているのは、私は心の中で、次の「ビジネスオブジェクト」でフォームを持っているとしましょう:ラウンドトリップビューデータ
public class MyObject
{
public string Name { get; set; }
public User OtherUser { get; set; }
public DateTime CreateDate { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
}
ユーザーがいずれかのフィールドにデータを入力すると私は彼らの反応を再入力することなく、脂肪指などを修正するために彼らが入力したものをラウンドトリップする必要があります。
私は往復DateTime
フィールドに「2011年2月31日」のような値が、私はこのようなビューモデルオブジェクト使用して終了することはできませんので:
public class MyObjectViewModel
{
public string Name { get; set; }
public string OtherUserName { get; set; }
public string CreateDate { get; set; }
public string StartDate { get; set; }
public string EndDate { get; set; }
}
を[OK]を、すべてが細かく、
public ActionResult Create(FormCollection form)
{
var model = new MyObjectViewModel();
if (TryUpdateModel(model, form) && ModelState.IsValid)
{
// ...
}
return View(model);
}
私は、次の質問を持つ:ダンディ、私は次のパターンを使用している場合、これは裸のビジネス・オブジェクトと値の往復とまったく同じレンダリングするために取得することができます
- データをビューモデルからビジネスオブジェクトに取り込む最もクリーンな方法は何ですか? (つまり、上記の方法の残りの部分を記入してください)
- 変更を統合するために、オブジェクト間のフィールド名の重複を減らすことはできますか?
- 上記の例では、フィールド
OtherUserName
は、User
オブジェクトに変換する必要があるstring
です。誰の責任ですか?コントローラー? ViewModel?モデルバインダー?
1)まず、私の意見が強く型付けされています。また、そうしなければ、データはラウンドトリップしないので、既存のデータベースオブジェクトをそのように更新することはできません。 3)データベース内のオブジェクトのIDにユーザータイプを設定したいのですか?私はそれがうまくいくとは思わない。 –
1)次に、最もクリーンな方法は、コントローラにFormCollectionの代わりに "MyObject"タイプが必要であることを伝えることです。厳密に型指定されたビューを使用している場合、バインディングは簡単です。 3)いいえ、私は通常、JSON/AJAXを介してフレンドリーな名前を取得し、それをドロップダウンにバインドします。ユーザーはそれを選択できますが、IDはコントローラーに渡されます(これを行うにはJavaScriptのヘルプが必要です - 選択したIDを隠しモデルIDフィールドにバインドするビューで必要です)。 AutoMapper用の –