我有下一个视图模型:
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 的重载之一,例如:
@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 将自动使用正确的模板。
当涉及到绑定时,您将需要一个自定义模型绑定器。我在这里说明了一个:https ://stackoverflow.com/a/6485552/29407