如何将UIHint属性用于接口的属性类型?

时间:2012-08-21 14:59:16

标签: c# asp.net-mvc-3 interface

我有下一个视图模型:

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

    public IAddressViewModel {get;set;}
}

取决于IAddressViewModel的实现我想使用适当的UIHint(“Airport”),UIHint(“Seaport”)等。有可能吗?如果是,怎么样?

2 个答案:

答案 0 :(得分:1)

您可以在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的编辑器模板。

答案 1 :(得分: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将自动使用正确的模板。

当涉及到绑定时,您将需要一个自定义模型绑定器。我在这里说明了一个:https://stackoverflow.com/a/6485552/29407