MVC 4 Gegevensannotaties “Display” Attribuut

Ik begin met MVC 4 (Razor View Engine). (Ik geloof dat dit mogelijk ook van toepassing is op MVC 3 en eerder.) Ik vraag me af of er een voordeel is voor het gebruik van de DisplayatTRIBUTE Gegevensannotatie in het oog in een weergave versus gewoon een string rechtstreeks in de HTML schrijven. Als ik bijvoorbeeld het volgende model had:

public class Thing
{
    public string WildAndCrazyProperty { get; set; }
}

… zou er een voordeel zijn bij het annoteren van het pand als:

   [Display(Name = "Wild and Crazy")]
    public string WildAndCrazyProperty { get; set; }

… en mijn markup hebben:

<html>
    <body>
        <div>@Html.DisplayNameFor(modelItem => modelItem.WildAndCrazyProperty)</div>
        <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
    </body>
</html>

… versus niet de annotatie en doen:

<html>
    <body>
        <div>Wild and Crazy</div>
        <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
    </body>
</html>

De reden waarom ik niet heb genoemd Html.LabelForIn dit geval is omdat de gegevens van de accommodatie als statische (d.w.z. niet-bewerkbare) tekst op de pagina worden weergegeven. De gegevens zullen nooit op deze pagina worden bewerkt, dus het is niet nodig dat ik Html.TextBoxForbinnen het tweede & lt; div & gt; en gebruik vervolgens de Html.LabelForom een ​​label met dat tekstvak goed te associëren.


Antwoord 1, Autoriteit 100%

Als twee verschillende weergaven hetzelfde model delen (bijvoorbeeld, misschien is er een voor mobiele output en de ene is normaal), het kan leuk zijn om de snaar te laten verblijven in een enkele plaats: als metadata op het viewmodel.

Bovendien, als u een geërfde versie van het model had gehad dat een ander scherm nodig heeft, zou het nuttig kunnen zijn. Bijvoorbeeld:

public class BaseViewModel
{
    [Display(Name = "Basic Name")]
    public virtual string Name { get; set; }
}
public class OtherViewModel : BaseViewModel
{
    [Display(Name = "Customized Inherited Name")]
    public override string Name { get; set; }
}

Ik geef toe dat dat voorbeeld behoorlijk is gekunsteld …

Dat zijn de beste argumenten ten gunste van het gebruik van het attribuut waarmee ik kan bedenken. Mijn persoonlijke mening is dat, voor het grootste deel, dat soort dingen het best aan de markup is.


Antwoord 2, Autoriteit 25%

Naast de andere antwoorden is er een groot voordeel voor het gebruik van de DisplayAttributewanneer u de velden wilt lokaliseren. U kunt de naam opzoeken in een localisatiedatabase met behulp van het displayattribute en het zal elke vertaling die u wenst te gebruiken.

Ook kunt u MVC de sjablonen voor u genereren met behulp van Html.EditorForModel()en het zal het juiste label voor u genereren.

Uiteindelijk is het aan jou. Maar de MVC is erg “Model-Centric”, daarom worden gegevensattributen toegepast op modellen, zodat metadata op één plaats bestaat. Het is niet alsof het een enorme hoeveelheid extra typen is die je moet doen.


Antwoord 3, Autoriteit 16%

Een van de voordelen is dat u het in meerdere weergaven kunt gebruiken en een consistente labeltekst hebt. Het wordt ook gebruikt door ASP.NET MVC-steigers om de tekst van de labels te genereren en maakt het gemakkelijker om zinvolle tekst te genereren

[Display(Name = "Wild and Crazy")]
public string WildAndCrazyProperty { get; set; }

“wild en gek” verschijnt consistent waar u de accommodatie in uw toepassing gebruikt.

Soms is dit niet flexibel, omdat u de tekst in enig weergave wilt wijzigen. In dat geval moet u aangepaste markup gebruiken zoals in uw tweede voorbeeld


Antwoord 4

ook internationalisering.

Ik heb hier een tijdje met de gek gehouden. Deed dit in mijn model:

[Display(Name = "XXX", ResourceType = typeof(Labels))]

Ik had een aparte klasse bibliotheek voor alle bronnen, dus ik had labels.resx, labels.culture.resx, enz.

Daar had ik key = xxx, waarde = “zinvolle reeks in die cultuur.”

Other episodes