Company モデルのアプリケーションがあります。Company モデルには、Address モデルへのナビゲーション プロパティがあります (1 対 1 の関係)。
会社.cs
public class Company
{
public int CompanyID { get; set; }
public string Name { get; set; }
// Snip...
public virtual Address Address { get; set; }
}
編集、詳細、および作成アクションを処理するビュー モデルを作成しました。
CompanyViewModel.cs
public class CompanyViewModel
{
public int CompanyID { get; set; }
[Required]
[StringLength(75, ErrorMessage = "Company Name cannot exceed 75 characters")]
public string Name { get; set; }
// Snip...
public Address Address { get; set; }
}
コントローラーで AutoMapper を使用して、モデルとビュー モデルの間で前後にマップしていますが、すべてが正常に機能しています。しかし、住所オブジェクトで検証を使用したいと考えています。住所が存在しない状態で会社を作成したくありません。
私が最初に考えたのは単純なルートでした。Address プロパティに「[Required]」アノテーションを付けてみました。これは何もしませんでした。
次に、Address プロパティを廃止してビュー モデルでそのデータを抽象化する方がよいと考えたので、Address クラスのすべてのプロパティのビュー モデルにプロパティを追加しました。
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
// etc....
これは良い方法のように思えましたが、AutoMapper はこれらのプロパティを Company クラスの Address オブジェクトにマップできないため、コントローラーで手動でマップする必要がありました。
public ActionResult Details(int id = 0)
{
// Snip code retrieving company from DB
CompanyViewModel viewModel = new CompanyViewModel();
viewModel.Name = company.Name;
viewModel.Address1 = company.Address.Address1;
// Snip...
return View(viewModel);
}
これにより、1行のAutoMapperステートメントではなく、コントローラーに多くの余分なコードが作成されます...これを処理する正しい方法は何ですか(ビューモデルでのネストされたモデルの検証)?
Address プロパティをビュー モデルで直接公開するのは良い方法ですか?それとも、私が行ったように別のプロパティで抽象化する方がよいでしょうか?
ソースと宛先が完全に一致しない状況で AutoMapper を使用できますか?