अस्वीकरण: केवल ASP.NET MVC 3 के साथ निम्न काम करता है (नीचे अद्यतन देखें कि वह आपके पिछले संस्करणों का उपयोग कर रहे हैं)
निम्नलिखित मॉडल मानते हुए:
public class MyViewModel
{
[Display(Description = "some description", Name = "some name")]
public string SomeProperty { get; set; }
}
और निम्न दृश्य :
:
<%= Html.LabelFor(x => x.SomeProperty, true) %>
अपने कस्टम सहायक के अंदर आप मेटाडाटा से इस जानकारी को लाने सकता है
public static MvcHtmlString LabelFor<TModel, TValue>(
this HtmlHelper<TModel> self,
Expression<Func<TModel, TValue>> expression,
bool showToolTip
)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
var description = metadata.Description; // will equal "some description"
var name = metadata.DisplayName; // will equal "some name"
// TODO: do something with the name and the description
...
}
टिप्पणी: एक ही मॉडल की संपत्ति पर [DisplayName("foo")]
और [Display(Name = "bar")]
होने अनावश्यक है और [Display]
विशेषता में प्रयोग किया जाता नाम metadata.DisplayName
में प्राथमिकता दी है।
अद्यतन:
मेरे पिछले जवाब ASP.NET MVC 2.0 के साथ काम नहीं करेगा। गुणों के एक जोड़े हैं कि .NET 3.5 में DataAnnotations
के साथ डिफ़ॉल्ट रूप से भरना संभव नहीं है, और Description
उनमें से एक है।
public class DisplayMetaDataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(
IEnumerable<Attribute> attributes,
Type containerType,
Func<object> modelAccessor,
Type modelType,
string propertyName
)
{
var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault();
if (displayAttribute != null)
{
metadata.Description = displayAttribute.Description;
metadata.DisplayName = displayAttribute.Name;
}
return metadata;
}
}
जो आप Application_Start
में रजिस्टर होगा:: ASP.NET में इस लक्ष्य को पूरा MVC 2.0 आप एक कस्टम मॉडल मेटाडाटा प्रदाता इस्तेमाल कर सकते हैं
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
ModelMetadataProviders.Current = new DisplayMetaDataProvider();
}
और फिर सहायक अपेक्षा के अनुरूप काम करना चाहिए:
public static MvcHtmlString LabelFor<TModel, TValue>(
this HtmlHelper<TModel> self,
Expression<Func<TModel, TValue>> expression,
bool showToolTip
)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
var description = metadata.Description; // will equal "some description"
var name = metadata.DisplayName; // will equal "some name"
// TODO: do something with the name and the description
...
}
धन्यवाद! लेकिन यह काम नहीं कर रहा है, प्रदर्शन नाम और विवरण शून्य है? कृपया ध्यान दें कि यह एमवीसी 2 में है और एमवीसी 3 नहीं है। अगर मुझे यह सही लगता है तो आपका समाधान केवल एमवीसी 3 में काम करेगा? – Banshee
@SnowJim, हां, गुणों के एक जोड़े हैं कि .NET 3.5 में 'DataAnnotations' के साथ डिफ़ॉल्ट रूप से भरना संभव नहीं है, और विवरण उनमें से एक है। .NET 4.0 में इसे काम करना चाहिए। –
@SnowJim, कृपया एएसपी.नेट एमवीसी 2 में एक वर्कअराउंड के लिए मेरा अद्यतन देखें। –