7

私は次のビューモデルを持っています:

public class PickUpLocationViewModel 
{
    public DateTime PuDate {get;set}

    public IAddressViewModel {get;set;}
}

IAddressViewModel の実装に依存します 適切な UIHint("Airport")、UIHint("Seaport") などを使用したい.それは可能ですか? はいの場合、どのように?

4

2 に答える 2

1

次のように、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 というエディター テンプレートが使用されるようになります。

于 2012-08-24T12:33:02.903 に答える
1

次のモデルがあるとします。

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

于 2012-08-24T12:39:18.210 に答える