私は次のビューモデルを持っています:
public class PickUpLocationViewModel
{
public DateTime PuDate {get;set}
public IAddressViewModel {get;set;}
}
IAddressViewModel の実装に依存します 適切な UIHint("Airport")、UIHint("Seaport") などを使用したい.それは可能ですか? はいの場合、どのように?
私は次のビューモデルを持っています:
public class PickUpLocationViewModel
{
public DateTime PuDate {get;set}
public IAddressViewModel {get;set;}
}
IAddressViewModel の実装に依存します 適切な UIHint("Airport")、UIHint("Seaport") などを使用したい.それは可能ですか? はいの場合、どのように?
次のように、TemplateName の IAddressViewModel に追加のプロパティを作成できます。
public interface IAddressViewModel
{
string TemplateName { get; }
}
したがって、IAddressViewModel を実装するクラスごとに、次のような個別のテンプレート名を定義できます。
public class SeaportAddressViewModel : IAddressViewModel
{
public string TemplateName
{
get
{
return "Seaport";
}
}
}
次に、ビューで次のような EditorFor のオーバーロードの 1 つを使用できます。
@Html.EditorFor(m => m.Address, Model.Address.TemplateName)
これにより、Seaport.cshtml というエディター テンプレートが使用されるようになります。
次のモデルがあるとします。
public class PickUpLocationViewModel
{
public DateTime PuDate { get; set }
public IAddressViewModel Address { get; set; }
}
public class AirportAddressViewModel: IAddressViewModel
{
public string Terminal { get; set; }
}
public class SeaportAddressViewModel: IAddressViewModel
{
public int DockNumber { get; set; }
}
そしてコントローラーアクション:
public ActionResult Index()
{
var model = new PickUpLocationViewModel
{
Address = new AirportAddressViewModel { Terminal = "North" }
};
return View(model);
}
および対応するビュー:
@model PickUpLocationViewModel
@Html.DisplayFor(x => x.Address)
これで、対応する表示/エディター テンプレートを定義できます。
~/Views/Shared/EditorTemplates/AirportAddressViewModel.cshtml
:
@model AirportAddressViewModel
@Html.DisplayFor(x => x.Terminal)
~/Views/Shared/EditorTemplates/SeaportAddressViewModel.cshtml
:
@model SeaportAddressViewModel
@Html.DisplayFor(x => x.DockNumber)
具象型に基づいて、ASP.NET MVC は正しいテンプレートを自動的に使用します。
そして、バインドバックに関しては、カスタムモデルバインダーが必要になります. 私はここに1つを示しました: https://stackoverflow.com/a/6485552/29407