DisplayAttribute.Description atribut qiymatini qanday aks ettiraman?

Menda shunday xususiyatga ega namunaviy sinf bor:

[Display(Name = "Phone", Description="Hello World!")]
public string Phone1 { get; set; }

Mening fikrimcha, yorliqni ko'rsatish va kiritish uchun matn qutisini ko'rsatish juda oson:

@Html.LabelFor(model => model.Organization.Phone1)
@Html.EditorFor(model => model.Organization.Phone1)
@Html.ValidationMessageFor(model => model.Organization.Phone1)

Lekin Tavsif annotatsiyasi atributining qiymatini qanday ko'rsatishim mumkin, ya'ni "Salom dunyo!"?


person Jakob Gade    schedule 05.07.2011    source manba
comment
Shuningdek qarang: Display atributidagi ShortName (DataAnnotations)   -  person KyleMit    schedule 14.03.2018


Javoblar (13)


Men shunday yordamchi bilan yakunlandim:

using System;
using System.Linq.Expressions;
using System.Web.Mvc;

public static class MvcHtmlHelpers
{
    public static MvcHtmlString DescriptionFor<TModel, TValue>(this HtmlHelper<TModel> self, Expression<Func<TModel, TValue>> expression)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
        var description = metadata.Description;

        return MvcHtmlString.Create(string.Format(@"<span>{0}</span>", description));
    }
}

Meni to'g'ri yo'lga boshlaganlarga rahmat. :)

person Jakob Gade    schedule 05.07.2011
comment
Qo'shimcha oraliqni bartaraf qilish uchun men qaytishni return string.IsNullOrWhiteSpace(description) ? MvcHtmlString.Empty : MvcHtmlString.Create(string.Format(@"<span>{0}</span>", description)); ga o'zgartirdim - person ScottCate; 06.01.2013
comment
Sizning misolingizdan boshlab, men span tegini bekor qilish va ixtiyoriy ravishda cssClass qo'shish imkoniyati bilan buni biroz ko'proq ishlab chiqaman. gist.github.com/4469809 - person ScottCate; 07.01.2013
comment
@ScottCate, cssClass parametrini olish o'rniga, EditorFor da qilinganidek, o'rniga htmlAttributes parametrini olishingiz mumkin. - person Fred; 23.06.2015
comment
Agar DisplayAttribute oʻrniga DescriptionAttribute ni qoʻllab-quvvatlashingiz kerak boʻlsa, qoʻshimcha maʼlumotimni koʻring. - person Christian Gollhardt; 11.02.2016
comment
Qiziq, nima uchun Tavsif va agar BIZ ularni tupurish uchun kengaytmalarni yozishimiz kerak bo'lsa, Prompt ushbu atributning xususiyatlari sifatida mavjudmi? - person Scott Fraley; 20.12.2016
comment
MvcHtmlString faqat tavsif mazmuni bilan qaytarilishini taklif qilaman va amalga oshiruvchi jilet ko'rinishiga qaysi tegga o'ralganligini aniqlashga ruxsat beraman. - person Aaron Hudon; 27.06.2017
comment
Noma'lum sabablarga ko'ra mening VS misolim System.Func o'rniga Antlr.Func dan foydalanishga qaror qildi, shuning uchun hech qanday sababsiz qizil burmalar paydo bo'lishi mumkin bo'lgan har bir kishiga ogohlantirish beraman deb o'yladim. - person Setherith; 04.12.2018

Ushbu maqoladagi texnikadan foydalanish haqida Shaklingizdagi maydonlar uchun vizual maslahatlarni ko‘rsatish, siz qiymatga quyidagilar orqali kirishingiz mumkin:

@Html.TextBoxFor( 
        model => model.Email , 
        new { title = ModelMetadata.FromLambdaExpression<RegisterModel , string>( 
            model => model.Email , ViewData ).Description } )  
person Adam Tuliper - MSFT    schedule 19.09.2013
comment
Buni bir qadam oldinga olib borish va T4 shablonlarini yangilash mumkin, shunda bu usul yordamida yangi CRUD ko'rinishlari yaratiladi. - person Dylan Hayes; 05.11.2013

Men qabul qilingan javobni ishlatmoqchi edim, lekin u ASP.NET Core 1/2 (aka MVC) uchun ishlamadi. 6) chunki ModelMetadata.FromLambdaExpression endi mavjud emas va ExpressionMetadataProvider ga ko'chirildi (shuningdek, foydalanish biroz o'zgartirildi).

Bu ASP.NET Core 1.1 va 2 bilan ishlatishingiz mumkin boʻlgan yangilangan kengaytma usuli:

using System;
using System.Linq.Expressions;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;

public static class HtmlExtensions
{
    public static IHtmlContent DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        if (html == null) throw new ArgumentNullException(nameof(html));
        if (expression == null) throw new ArgumentNullException(nameof(expression));

        var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, html.ViewData, html.MetadataProvider);
        if (modelExplorer == null) throw new InvalidOperationException($"Failed to get model explorer for {ExpressionHelper.GetExpressionText(expression)}");

        return new HtmlString(modelExplorer.Metadata.Description);
    }
}

ASP.NET Core 1

ASP.NET Core 1 uchun bir xil kod ishlaydi, lekin sizga usings boshqa nom maydoni kerak bo'ladi:

using System;
using System.Linq.Expressions;
using Microsoft.AspNet.Html.Abstractions;
using Microsoft.AspNet.Mvc.ViewFeatures;

Foydalanish

@Html.DescriptionFor(model => model.Phone1)
person huysentruitw    schedule 09.02.2016
comment
Shunday qilib, mening ASP.NET Core 1.1 foydalanishim uchun nom bo'shliqlari quyidagilardir: Microsoft.AspNetCore.Html Microsoft.AspNetCore.Mvc.ViewFeatures.Internal Microsoft.AspNetCore.Mvc.Rendering - person serge; 21.07.2017
comment
ShortName xususiyati uchun yechimni qanday qilish kerak? modelExplorer.Metadata.ShortName degan narsa yo'q - person serge; 21.07.2017
comment
@Html.DescriptionFor(model =›model.First().Telefon1) IEnumerable bo'lsa - person user1855805; 18.07.2018
comment
Har kim Microsoft.AspNetCore.Mvc.ViewFeatures.Internal nom maydoni bilan qiynalmoqda? Bu "Microsoft.AspNetCore.Mvc.ViewFeatures" paketini o'rnatishga qaramay qizil rangda ko'rsatilmoqda. Men .NET Core 3.0 dan foydalanaman - person Ciaran Gallagher; 25.01.2020
comment
Ma’lum bo‘lishicha, bu kutubxona endi ASP.NET Core 3.0 bilan mos emas, uni bog‘liqlik kiritish orqali boshqa turdan olish kerak: github.com/dotnet/aspnetcore/issues/ - person Ciaran Gallagher; 25.01.2020
comment
Men buni ASP.NET Core 3 va 5 uchun yangiladim: stackoverflow.com/a/66602099/2266345 - person Ryan; 12.03.2021

ASP.NET MVC Core-da siz HTML-ni o'xshash qilib ko'rsatadigan yangi teg yordamchilaridan foydalanishingiz mumkin... HTML :)

Shunga o'xshash:

<div class="form-group row">
    <label asp-for="Name" class="col-md-2 form-control-label"></label>
    <div class="col-md-10">
        <input asp-for="Name" class="form-control" aria-describedby="Name-description" />
        <span asp-description-for="Name" class="form-text text-muted" />
        <span asp-validation-for="Name" class="text-danger" />
    </div>
</div>

Eslatma 1: Kirish elementida aria-describedby atributidan foydalanishingiz mumkin, chunki bu id avtomatik ravishda asp-description-for atributli span elementida yaratiladi.

Eslatma 2: Bootstrap 4 da form-text va text-muted sinflari blok darajasidagi yordam matni uchun v3 help-block sinfini almashtiradi.

Ushbu sehr sodir bo'lishi uchun siz shunchaki yangi teg yordamchisini yaratishingiz kerak:

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;

/// <summary>
/// <see cref="ITagHelper"/> implementation targeting &lt;span&gt; elements with an <c>asp-description-for</c> attribute.
/// Adds an <c>id</c> attribute and sets the content of the &lt;span&gt; with the Description property from the model data annotation DisplayAttribute.
/// </summary>
[HtmlTargetElement("span", Attributes = DescriptionForAttributeName)]
public class SpanDescriptionTagHelper : TagHelper
{
    private const string DescriptionForAttributeName = "asp-description-for";

    /// <summary>
    /// Creates a new <see cref="SpanDescriptionTagHelper"/>.
    /// </summary>
    /// <param name="generator">The <see cref="IHtmlGenerator"/>.</param>
    public SpanDescriptionTagHelper(IHtmlGenerator generator)
    {
        Generator = generator;
    }

    /// <inheritdoc />
    public override int Order
    {
        get
        {
            return -1000;
        }
    }

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; }

    protected IHtmlGenerator Generator { get; }

    /// <summary>
    /// An expression to be evaluated against the current model.
    /// </summary>
    [HtmlAttributeName(DescriptionForAttributeName)]
    public ModelExpression DescriptionFor { get; set; }

    /// <inheritdoc />
    /// <remarks>Does nothing if <see cref="DescriptionFor"/> is <c>null</c>.</remarks>
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        if (output == null)
        {
            throw new ArgumentNullException(nameof(output));
        }

        var metadata = DescriptionFor.Metadata;

        if (metadata == null)
        {
            throw new InvalidOperationException(string.Format("No provided metadata ({0})", DescriptionForAttributeName));
        }

        output.Attributes.SetAttribute("id", metadata.PropertyName + "-description");

        if( !string.IsNullOrWhiteSpace( metadata.Description))
        {
            output.Content.SetContent(metadata.Description);
            output.TagMode = TagMode.StartTagAndEndTag;
        }
    }
}

Teg yordamchilaringizni barcha Razor ko'rinishlarimiz uchun mavjud qiling. addTagHelper direktivasini Views/_ViewImports.cshtml fayliga qo'shing:

@addTagHelper "*, YourAssemblyName"

Eslatma 1: YourAssemblyName ni loyihangizning yig'ish nomi bilan almashtiring.

Eslatma 2: Buni barcha teg yordamchilaringiz uchun bir marta qilish kifoya!

Tag Helpers haqida batafsil maʼlumotni bu yerda: https://docs.asp.net/en/latest/mvc/views/tag-helpers/intro.html

Bo'ldi shu! Yangi teg yordamchilari bilan zavqlaning!

person Filipe Carneiro    schedule 22.09.2016
comment
Salom Stiven! Shuning uchun men In ASP.NET MVC Core bilan boshladim.... Savol har ikki dunyo uchun ham bir xil va bu eski savol bo'lsa-da, men ishonamanki, men kabi odamlar bugungi kunda bu savolga javob izlashda qoqilmoqda. ! Bugun men bu yerda javob izladim va bir necha soatlik izlanishlardan so‘ng noklarimiz uchun o‘z xulosalarimni baham ko‘rishga qaror qildim. Umid qilamanki, kimdir buni foydali deb topadi! - person Filipe Carneiro; 23.09.2016
comment
Men uchun eng yaxshi yechim. HtmlHelpers-ni juda eski va eskirgan deb hisoblash mumkinligi sababli, TagHelpers buni hal qilishning afzal usuli hisoblanadi. Bu javob yana ko'p ovozlarga loyiq! - person Alexander Christov; 21.04.2020

Agar kimdir qabul qilingan javobdan qanday foydalanishni bilmoqchi bo'lsa

1- Yechim tadqiqotchisida > Yangi jild qo‘shing > uni “Yordamchilar” deb nomlang, masalan,
2- Yangi sinf qo‘shing, uni “CustomHtmlHelpers” deb nomlang, masalan
3- Kodni joylashtiring:

public static class MvcHtmlHelpers
{
    public static string DescriptionFor<TModel, TValue>(this HtmlHelper<TModel> self, Expression<Func<TModel, TValue>> expression)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
        var description = metadata.Description;

        return string.IsNullOrWhiteSpace(description) ? "" : description;
    }
}

4- Sizning modelingizda yoki viewModel-da undan foydalanib:

[Display(Name = "User Name", Description = "Enter your User Name")]
public string FullName { get; set; }

5- Razor ko'rinishida @modeldan keyin ushbu qatorni kiriting

@using YOUR_PROJECT.Helpers 

6- Ta'rifni quyidagicha ko'rsating:

@Html.DescriptionFor(m => m.FullName) 

7- Matnni kiritish to'ldiruvchisida ko'rsatish uchun tavsifdan foydalanishni xohlashingiz mumkin:

@Html.DisplayNameFor(m => m.FullName)
@Html.TextBoxFor(m => m.FullName, new { @class = "form-control", placeholder = Html.DescriptionFor(m => m.FullName) })

rahmat

person Adel Mourad    schedule 26.09.2018

@ViewData.ModelMetadata.Properties
   .Where(m => m.PropertyName == "Phone1").FirstOrDefault().Description

Shunday qilib, agar siz bootstrap dan foydalansangiz, shunga o'xshash narsa

<div class="form-group col-sm-6">
   @Html.LabelFor(m => m.Organization.Phone1)
   @Html.EditorFor(m => m.Organization.Phone1)
   <p class="help-block">
      @ViewData.ModelMetadata.Properties
         .Where(m => m.PropertyName == "DayCount").FirstOrDefault().Description
   </p>
</div>
person Michael Tranchida    schedule 04.03.2016
comment
@ViewData.ModelMetadata.Properties.FirstOrDefault(m =› m.PropertyName == nameof(ServiceRequestPageViewModel.AcceptTerms))?.DisplayName ishga tushirish vaqtidagi xatolarni oldini olish uchun null tekshiruvi va nameof bilan yangilanadi - person EthR; 28.09.2018

Mana ASP.NET Core 3.1 va 5 uchun yangilangan versiya:

public static class HtmlExtensions
{
    public static IHtmlContent DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        if (html == null) throw new ArgumentNullException(nameof(html));
        if (expression == null) throw new ArgumentNullException(nameof(expression));

        var expressionProvider = html.ViewContext?.HttpContext?.RequestServices?.GetService<ModelExpressionProvider>()
            ?? new ModelExpressionProvider(html.MetadataProvider);
        var modelExpression = expressionProvider.CreateModelExpression(html.ViewData, expression);

        return new HtmlString(modelExpression.Metadata.Description);
    }
}

Biz ModelExpressionProvider orqali o'tishimiz kerak, chunki ExpressionMetadataProvider ichki belgilandi.

ModelExpressionProvider.CreateModelExpression() baribir ExpressionMetadataProvider.FromLambdaExpression() ga ichki qo'ng'iroq qiladi:

person Ryan    schedule 12.03.2021

Tavsif atributi qiymatini berish uchun modelingizga mos keladigan maxsus yordamchi yozishingiz kerak bo'ladi.

person Illuminati    schedule 05.07.2011
comment
Men MVC ramkasida biror narsa o'rnatilgan bo'lishiga umid qilgandim, ayniqsa Dynamic Data atributni qo'llab-quvvatlaydi va matnni diskret maslahat sifatida ko'rsatadi. - person Jakob Gade; 05.07.2011
comment
Men bilishimcha, tahtga o'xshash narsa hali o'rnatilgan emas. bunga qarang... stackoverflow.com/questions/4973830/ - person Illuminati; 05.07.2011

...va agar siz tavsifni forma yorlig'ida asboblar maslahati sifatida olishni istasangiz, quyidagi kabi teg yordamchisini qo'shing:

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;

/// <summary>
/// <see cref="ITagHelper"/> implementation targeting &lt;label&gt; elements with an <c>asp-for</c> attribute.
/// Adds a <c>title</c> attribute to the &lt;label&gt; with the Description property from the model data annotation DisplayAttribute.
/// </summary>
[HtmlTargetElement("label", Attributes = ForAttributeName)]
public class LabelTitleTagHelper : TagHelper
{
    private const string ForAttributeName = "asp-for";

    /// <summary>
    /// Creates a new <see cref="LabelTitleTagHelper"/>.
    /// </summary>
    /// <param name="generator">The <see cref="IHtmlGenerator"/>.</param>
    public LabelTitleTagHelper(IHtmlGenerator generator)
    {
        Generator = generator;
    }

    /// <inheritdoc />
    public override int Order
    {
        get
        {
            return -1000;
        }
    }

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; }

    protected IHtmlGenerator Generator { get; }

    /// <summary>
    /// An expression to be evaluated against the current model.
    /// </summary>
    [HtmlAttributeName(ForAttributeName)]
    public ModelExpression TitleFor { get; set; }

    /// <inheritdoc />
    /// <remarks>Does nothing if <see cref="TitleFor"/> is <c>null</c>.</remarks>
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        if (output == null)
        {
            throw new ArgumentNullException(nameof(output));
        }

        var metadata = TitleFor.Metadata;

        if (metadata == null)
        {
            throw new InvalidOperationException(string.Format("No provided metadata ({0})", ForAttributeName));
        }

        if (!string.IsNullOrWhiteSpace(metadata.Description))
            output.Attributes.SetAttribute("title", metadata.Description);
    }
}

Bu DisplayAttribute model ma'lumotlar izohidan Description xususiyati bilan yangi title atributini yaratadi.

Chiroyli tomoni shundaki, siz yaratgan iskala ko'rinishlariga tegishingiz shart emas! Chunki bu teg yordamchisi allaqachon mavjud label elementining asp-for atributiga qaratilgan!

person Filipe Carneiro    schedule 23.09.2016
comment
Bu mavjud asp-fordan qanday foydalanishini yaxshi ko'raman, bu meni veb-saytimdagi har bir yorliqni o'zgartirishga majbur qiladi. Yaxshi! - person Mike; 02.07.2020

Yakob Gade'aga qo'shimcha ravishda ajoyib javob:

Agar siz DisplayAttribute oʻrniga DescriptionAttribute ni qoʻllab-quvvatlashingiz kerak boʻlsa, MetadataProviderni bekor qilsak ham uning ajoyib yechimi ishlaydi:

public class ExtendedModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<System.Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        //Possible Multiple Enumerations on IEnumerable fix
        var attributeList = attributes as IList<System.Attribute> ?? attributes.ToList();

        //Default behavior
        var data = base.CreateMetadata(attributeList, containerType, modelAccessor, modelType, propertyName);

        //Bind DescriptionAttribute
        var description = attributeList.SingleOrDefault(a => typeof(DescriptionAttribute) == a.GetType());
        if (description != null)
        {
            data.Description = ((DescriptionAttribute)description).Description;
        }

        return data;
    }
}

Bu Global.asax.cs-dagi Application_Start usulida registrlar bo'lishi kerak:

ModelMetadataProviders.Current = new ExtendedModelMetadataProvider();
person Christian Gollhardt    schedule 11.02.2016

HANDL javobi, ASP.NET Core 2.0 uchun yangilangan

using System;
using System.Linq.Expressions;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;

public static class HtmlExtensions
{
    public static IHtmlContent DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        if (html == null) throw new ArgumentNullException(nameof(html));
        if (expression == null) throw new ArgumentNullException(nameof(expression));

        var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, html.ViewData, html.MetadataProvider);
        if (modelExplorer == null) throw new InvalidOperationException($"Failed to get model explorer for {ExpressionHelper.GetExpressionText(expression)}");

        return new HtmlString(modelExplorer.Metadata.Description);
    }
}
person Randy Gamage    schedule 24.09.2017
comment
Allaqachon bu javobda koʻrib chiqilgan. Nomlar maydonini yangilash asl javobda yoki dublikatni joylashtirish o'rniga sharh qo'shish orqali amalga oshirilishi kerak edi. - person huysentruitw; 02.02.2018

Siz har doim o'zingizning shaxsiy kengaytmangizni quyidagicha yaratishingiz mumkin:

    public static MvcHtmlString ToolTipLabel (string resourceKey, string text, bool isRequired, string labelFor = "", string labelId = "",string className="")
    {
        string tooltip = string.Empty;

        StringBuilder sb = new StringBuilder();

        if (!string.IsNullOrEmpty(resourceKey))
        {
            var resources = GetAllResourceValues();

            if (resources.ContainsKey(resourceKey))
            {
                tooltip = resources[resourceKey].Value;
            }
        }

        sb.Append("<label");

        if (!string.IsNullOrEmpty(labelFor))
        {
            sb.AppendFormat(" for=\"{0}\"", labelFor);
        }

        if (!string.IsNullOrEmpty(labelId))
        {
            sb.AppendFormat(" Id=\"{0}\"", labelId);
        }

        if (!string.IsNullOrEmpty(className))
        {
            sb.AppendFormat(" class=\"{0}\"", className);
        }

        if (!string.IsNullOrEmpty(tooltip))
        {

            sb.AppendFormat(" data-toggle='tooltip' data-placement='auto left' title=\"{0}\"",tooltip);

        }
        if (isRequired)
        {
            sb.AppendFormat("><em class='required'>*</em> {0} </label></br>", text);
        }
        else
        {
            sb.AppendFormat(">{0}</label></br>", text);
        }
        return MvcHtmlString.Create(sb.ToString());
    }

va uni shunday ko'rinishda olish mumkin:

@HtmlExtension.ToolTipLabel(" "," ",true," "," "," ")
person Karan    schedule 25.09.2017
comment
Savol, ko'rinishdagi displey atributidan tavsifni qanday olish kerak, bu kod qismi qanday yordam berishini tushunmayapman. - person huysentruitw; 12.02.2018

person    schedule
comment
Ishlar. Men DisplayAttribute o'rniga DescriptionAttribute dan foydalanishim kerak edi. - person vvvv4d; 05.06.2019
comment
@vvvv4d keyin ... shunday qilasizmi? Buning o'rniga DescriptionAttribute dan foydalaning va yakuniy qiymat uchun .Description ga yoki xom satr uchun .DescriptionValue ga kiring - person Marc Gravell; 05.06.2019