यदि दृश्य में मॉडल सिक्के है तो मैं इसे ठीक काम करने में सक्षम था। हालांकि अगर मॉडल खजाना है, तो यह विफल रहता है। क्यूं कर? क्योंकि जब एचटीएमएल हेल्पर एचटीएमएल प्रस्तुत करता है तो यह केवल उस मॉडल प्रकार को देखता है जो दृश्य में निर्दिष्ट है, न कि वास्तविक वस्तु का ऑब्जेक्ट प्रकार। जब यह विशेषता प्राप्त करने के लिए जाता है तो यह केवल खजाने के लिए विशेषता प्राप्त करेगा, न कि सिक्के। मुझे लगता है कि इसके लिए आपको अपना खुद का एचटीएमएल हेल्पर लिखना होगा।
internal static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string labelText, IDictionary<string, object> htmlAttributes, ModelMetadataProvider metadataProvider)
{
return LabelExtensions.LabelHelper((HtmlHelper) html, ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData, metadataProvider), ExpressionHelper.GetExpressionText((LambdaExpression) expression), labelText, htmlAttributes);
}
कवर के तहत, MVC ModelMetadata.FromLambdaExpression<TModel, TValue>
उपयोग करता है "DisplayName" लगता है और जब यह प्रकार में ... यह रिटर्न PropertyName
पारित कर दिया पर एक खोजने के लिए विफल रहता है।
internal static MvcHtmlString LabelHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string labelText = null, IDictionary<string, object> htmlAttributes = null)
{
string str = labelText;
if (str == null)
{
string displayName = metadata.DisplayName;
if (displayName == null)
{
string propertyName = metadata.PropertyName;
if (propertyName == null)
str = Enumerable.Last<string>((IEnumerable<string>) htmlFieldName.Split(new char[1]
{
'.'
}));
else
str = propertyName;
}
else
str = displayName;
}
string innerText = str;
if (string.IsNullOrEmpty(innerText))
return MvcHtmlString.Empty;
TagBuilder tagBuilder1 = new TagBuilder("label");
tagBuilder1.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
tagBuilder1.SetInnerText(innerText);
TagBuilder tagBuilder2 = tagBuilder1;
bool flag = true;
IDictionary<string, object> attributes = htmlAttributes;
int num = flag ? 1 : 0;
tagBuilder2.MergeAttributes<string, object>(attributes, num != 0);
return TagBuilderExtensions.ToMvcHtmlString(tagBuilder1, TagRenderMode.Normal);
}
और दृश्य में मॉडल क्या है ... खजाना या सिक्के? – CrazyDart
क्या आपने ट्रेजर ऑब्जेक्ट पर और सिक्के ऑब्जेक्ट पर डिफ़ॉल्ट मान लागू करने का प्रयास किया है? सिर्फ एक विचार। –
बस स्पष्ट होने के लिए, रेजर मार्कअप के स्निपेट को देखना अच्छा होगा जिसमें "लेबलफ़ोर" शामिल है। –