シナリオ:ナビゲーションプロパティのAsp.net MVCの検証エラーを克服する方法
私はEntity FrameworkをしてAsp.Net MVCプロジェクトを実施しています。
class Employee{
public int Id{get;set;}
[Required]
public string Name{get;set;}
}
class Department{
public int Id{get;set;}
public string DepartmentName{get; set;}
public virtual Employee manager{get; set;}
}
ここで、データベースの従業員のリストからマネージャーを持つ新しい部門を作成する必要があります。このため、ビューとコントローラアクションは次のとおりです。
@Html.EditorFor(model => model.DepartmentName)
@Html.DropDownListFor(model => model.manager.Id, new SelectList(ViewBag.Managers, "Id", "Name"))
public class DepartmentController: Controller{
private MyDatabaseContext db = new MyDatabaseContext();
[HttpGet]
public ActionResult Create(){
ViewBag.Managers = db.Employees.ToList();
return View();
}
[HttpPost]
public ActionResult Create(Department d){
if(ModelState.IsValid){
d.manager = db.Employees.Find(d.manager.Id);
db.Departments.Add(d);
db.SaveChanges();
return RedirectToAction("Index");
}
else{
//error response.
//Error encounters as d.manager.Name field would be null.
}
}
}
問題:プログラム上で実行している場合
ModelState.IsValid
は常にfalse
あるとして、私は、新しいDepartment
のオブジェクトを作成することはできません。これは、ナビゲーションプロパティmanager
にフィールドName
があり、フォームを送信するときにnull
となるためです。 Name
が必須フィールドであるため、これはエラーとしてリストされます。
質問:
どのように私は、ナビゲーションプロパティの分野でnull
に起因するエラーを克服することができますか?または、このエラーを取り除くためにこのコードを実装する他の方法がありますか?
注:
私はDepartment
オブジェクトを作成するための単なる便利ViewModel
異なるを作成しないことに注意してください。私はDRY原則に従うことを好むでしょう。 また、私はEmployees
テーブルの外部キーとなる別のフィールド(managerId
のようなもの)を作成したくありません。なぜなら、オブジェクト指向モデルに注意を払ったデータベースの関連付けは望んでいないからです。 department.managerId
[Key]フィールドを渡すことによって、エンティティフレームワークからマネージャオブジェクトを読み取るのではなく、department.manager
によってマネージャを取得するのが常によりクリーンです。
ありがとうございます。
いつものように、ビューモデルを使用します(問題を解決する唯一の現実的な方法です)。 DRYプリンシパルを破ることはありません。すべてのビュー、特に編集用のビューは、独自のビューモデルを持つ必要があります。 [MVCのViewModelとは何ですか?](http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc)も参照してください。また、そのビューモデルには、 'ViewBag'の使用を避け、強い型付けのバインディングを得るために、IEnumerable ManagerList'も含まれている必要があります。 –
@StephenMueckeが説明した方法でViewModelを実装しました。このソリューションは正常に動作し、アーキテクチャとコードもきれいに見えます。しかし、私はまだ私の心に一つの質問があります。 Spring MVCでは、ナビゲーションプロパティの '@ Valid'アノテーションを入れて、フレームワークにナビゲーションプロパティの妥当性を検証させることができます。 '@ Valid'アノテーションを付けないと、フレームワークはバリデーションを実行せず、エラーも発生しません。あなたはAsp.Net MVCのそのような注釈/機能を知っていますか? –