Soru MVC Görünümündeki modelden displayName özniteliğine erişme


Benim modelim varsa

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

Sonra View with LabelFor ile yazdırabilirim

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

Sonra işlenecek

<label for="firstName">First Name</label>
  • Ancak, görünümündeki özellik (FirstName) özelliklerini "işlenmemiş" olarak nasıl "ham" yapabilirim? Örneğin, değeri Görünüm sayfasındaki bir işleve göndermek istiyorum.

25
2017-09-14 15:10


Menşei


Aşağıdaki cevaplardan birini kabul etmelisiniz. - David Kennedy


Cevaplar:


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

38
2017-12-13 03:14





Özelliklere erişmek için bir özelliğe ihtiyacınız olacak Html yardımcı. Öznitelikler mülkün veya modelin bir parçası olmadığından, bunlara erişmek için bir yol bulmak zorundasınız.

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

DataAnnotations'ın bir parçası olmayan ek özellikler için aşağıdakileri yapabilirsiniz:

Özel bir özellik oluştur

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

Sihirli, OnMetadataCreated uygulamasında gerçekleşir. Burada, Ek Özellikler'i özel Niteliklerimiz için ihtiyaç duyduğumuz herhangi bir şeyle doldurabiliriz. Bu durumda bir Tooltip anahtarı ekliyoruz. Diğer nitelikler veya sağlayıcılar kendi adlarını aynı ada sahip ekleyebileceğinden, adınız benzersiz olmalıdır. Bu özniteliklerin her zaman aynı sırayla okunmadığını unutmamak önemlidir. Bu yüzden, tooltip özniteliğiniz ilk, son veya ortada bir yerde çağrılabilir. Bu istenmeyen etkilere neden olabileceğinden önemli bir ayrımdır.

Ardından özel bir Attribute yardımcısı oluşturun

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
2017-09-14 15:49



Tam ihtiyacım olan şey. İlk örneğini kullanıyorum ve harika çalışıyor. Teşekkürler! :) - haagel
Örneğinizi @ Html.TooltipFor (model => model.Name) olarak kullanmaya çalışıyorum ve hata almaya devam ediyorum: Yöntem için tür argümanı kullanımdan çıkarılamıyor, argümanları belirtmeyi deneyin. - bugrasitemkar


Öznitelik değerine erişebilirsiniz Display(Name="...") 4 adımda:

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;

Sonra displayname değere sahip olacak First Name senin bağlamında.


5
2017-11-27 13:22





Darren Oster'un cevabı üzerine inşa:

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

Bunun için belgelere bir bağlantı: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.displaynameextensions.displaynamefor(v=vs.118).aspx

Bunu görünüm kodunuzda şöyle kullanabilirsiniz:

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

    // call function
    DoStuff(foo);
}

1
2017-07-25 01:51





sadece kullanmalısın

[Display(Name = "First Name")]


 public string name{ get; set; }

0
2018-01-25 12:24





@(This.Model.acc_first)

Çalışmalı

javascript’te bunu kullanabilirsiniz

function callme(val)
{
   //some ajax call with 
   @(This.Model.acc_first)
}

-2
2017-09-14 15:19



Soru, mülkün değerini değil, mülkün Görünen Adını (DisplayNameAttribute) almayı sormaktır. - Darren Oster


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

senin için çalışmalı. Değilse, sadece deneyin

@Model.acc_first

Ya iyi çalışmalı.


-2
2017-09-14 17:18



Soru, mülkün değerini değil, mülkün Görünen Adını (DisplayNameAttribute) almayı sormaktır. - Darren Oster