7 votes

Comment utiliser l'attribut UIHint pour le type de propriété de l'interface ?

J'ai le modèle de vue suivant :

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

    public IAddressViewModel {get;set;}
}

En fonction de l'implémentation du modèle IAddressViewModel, je souhaite utiliser les mentions UIHint("Airport"), UIHint("Seaport"), etc. appropriées. Est-ce possible ? Si oui, comment ?

1voto

Ian Routledge Points 2155

Vous pourriez créer une propriété supplémentaire sur le modèle IAddressViewModel de TemplateName comme suit :

public interface IAddressViewModel
{
    string TemplateName { get; }
}

Ainsi, pour chaque classe qui implémente IAddressViewModel, vous pouvez définir un nom de modèle distinct, comme par exemple :

public class SeaportAddressViewModel : IAddressViewModel
{
    public string TemplateName
    {
        get
        {
            return "Seaport";
        }
    }
}

Ensuite, dans votre vue, vous pouvez utiliser l'une des surcharges de EditorFor, comme par exemple :

@Html.EditorFor(m => m.Address, Model.Address.TemplateName)

Cela devrait permettre d'utiliser le modèle de l'éditeur appelé Seaport.cshtml.

1voto

Darin Dimitrov Points 528142

Supposons que vous disposiez des modèles suivants :

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; }
}

puis une action du contrôleur :

public ActionResult Index() 
{
    var model = new PickUpLocationViewModel 
    {
        Address = new AirportAddressViewModel { Terminal = "North" }
    };
    return View(model);
}

et une vue correspondante :

@model PickUpLocationViewModel
@Html.DisplayFor(x => x.Address)

Vous pouvez maintenant définir les modèles d'affichage/éditeur correspondants :

~/Views/Shared/EditorTemplates/AirportAddressViewModel.cshtml :

@model AirportAddressViewModel
@Html.DisplayFor(x => x.Terminal)

~/Views/Shared/EditorTemplates/SeaportAddressViewModel.cshtml :

@model SeaportAddressViewModel
@Html.DisplayFor(x => x.DockNumber)

Maintenant, en fonction du type de béton, ASP.NET MVC utilisera automatiquement le bon modèle.

Pour la reliure, vous aurez besoin d'un modèle de reliure personnalisé. J'en ai illustré un ici : https://stackoverflow.com/a/6485552/29407

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X