it-swarm.it

Accedi all'attributo displayName dal modello in MVC View

Se il mio modello ha

[DisplayName("First Name")]
public string firstName { get; set; }

Quindi posso stamparlo nella vista con LabelFor

@Html.LabelFor(model => model.acc_first)

Renderà quindi come

<label for="firstName">First Name</label>
  • Ma come posso "raw" leggere gli attributi property (FirstName) nella View? Se ad esempio, voglio inviare il valore a una funzione nella pagina Visualizza
27
Joakim
@Html.DisplayNameFor(x => x.acc_first)
41
Darren Oster

Per accedere agli attributi è necessario un helper Htmlpersonalizzato. Dal momento che gli attributi non fanno realmente parte della proprietà o del modello, è necessario andare in un giro su come accedervi. 

public static IHtmlString DisplayName<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);

    return new HtmlString(metadata.DisplayName);
}

Per gli attributi aggiuntivi che non fanno parte di DataAnnotations, puoi eseguire le seguenti operazioni:

Crea un attributo personalizzato

public class TooltipAttribute : Attribute, IMetadataAware {
    public TooltipAttribute(string tooltip) {
        this.Tooltip = tooltip;
    }

    public string Tooltip { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata) {
        metadata.AdditionalValues["Tooltip"] = this.Tooltip;
    }
}

La magia avviene nell'implementazione OnMetadataCreated. Qui possiamo popolare gli AdditionalValues ​​con qualsiasi cosa di cui abbiamo bisogno per il nostro particolare Attributo. In questo caso stiamo aggiungendo una chiave Tooltip. Il tuo nome dovrebbe essere unico in quanto altri attributi o provider potrebbero aggiungere le proprie chiavi con lo stesso nome. È importante ricordare che gli attributi non vengono sempre letti nello stesso ordine. Quindi il tuo attributo tooltip può essere chiamato prima, ultimo o da qualche parte nel mezzo. Questa è una distinzione importante in quanto potrebbe causare effetti indesiderati.

Quindi creare un helper di attributo personalizzato

public static IHtmlString TooltipFor<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);
    if (metadata.AdditionalValues.ContainsKey("Tooltip"))
        return new HtmlString((string)metadata.AdditionalValues["Tooltip"]);

    return new HtmlString("");
}
13
Buildstarted

Puoi accedere al valore dell'attributo Display(Name="...") in 4 passaggi:

var type = typeof(YourNamespace.Models.YourModelName);
var memInfo = type.GetMember("firstName"); // your member
var attributes = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false);
var displayname = ((System.ComponentModel.DataAnnotations.DisplayAttribute)attributes[0]).Name;

Quindi displayname avrà il valore First Name nel tuo contesto.

5
outofmind

Basandosi sulla risposta di Darren Oster:

@Html.DisplayNameFor(x => x.acc_first)

Ecco un link alla documentazione per questo: https://msdn.Microsoft.com/en-us/library/system.web.mvc.html.displaynameextensions.displaynamefor(v=vs.118).aspx

Potresti usare questo nel tuo codice di visualizzazione in questo modo:

@{ 
    var foo = Html.DisplayNameFor(x => x.acc_first);

    // call function
    DoStuff(foo);
}
3
bvpb

dovresti semplicemente usare

[Display(Name = "First Name")]


 public string name{ get; set; }
0
Manish Singh