2013-09-30 5 views
5

मैं एक सार मॉडलMVC सार गुण

public abstract class Treasure { 
    public abstract int Value { get; } 
    public abstract string Label { get; } 
} 

और एक कार्यान्वयन

public class Coins : Treasure { 
    [DisplayName("Coin Value")] 
    public override int Value { 
     get { ... } 
    } 

    [DisplayName("Coins")] 
    public override string Label { 
     get { ... } 
    } 

मेरे सिक्के वस्तु मेरे विचार में अपने लेबल के रूप में "सिक्के" प्रदर्शित नहीं करता है जब मैं Html.LabelFor का उपयोग पर पर गुण यह, यह "लेबल" दिखाता है। यदि मैं डिस्प्लेनाम विशेषता को ट्रेजर में ले जाता हूं, तो यह काम करता है ... लेकिन मुझे ट्रेजर क्लास के विभिन्न कार्यान्वयन के लिए लेबल बदलने में सक्षम होना चाहिए। क्या यह संभव है?

+0

और दृश्य में मॉडल क्या है ... खजाना या सिक्के? – CrazyDart

+0

क्या आपने ट्रेजर ऑब्जेक्ट पर और सिक्के ऑब्जेक्ट पर डिफ़ॉल्ट मान लागू करने का प्रयास किया है? सिर्फ एक विचार। –

+0

बस स्पष्ट होने के लिए, रेजर मार्कअप के स्निपेट को देखना अच्छा होगा जिसमें "लेबलफ़ोर" शामिल है। –

उत्तर

4

यदि दृश्य में मॉडल सिक्के है तो मैं इसे ठीक काम करने में सक्षम था। हालांकि अगर मॉडल खजाना है, तो यह विफल रहता है। क्यूं कर? क्योंकि जब एचटीएमएल हेल्पर एचटीएमएल प्रस्तुत करता है तो यह केवल उस मॉडल प्रकार को देखता है जो दृश्य में निर्दिष्ट है, न कि वास्तविक वस्तु का ऑब्जेक्ट प्रकार। जब यह विशेषता प्राप्त करने के लिए जाता है तो यह केवल खजाने के लिए विशेषता प्राप्त करेगा, न कि सिक्के। मुझे लगता है कि इसके लिए आपको अपना खुद का एचटीएमएल हेल्पर लिखना होगा।

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

कोड के साथ अच्छी व्याख्या। दरअसल यह वास्तविक रूप से '@ मॉडल 'घोषणा नहीं देखता है। –

संबंधित मुद्दे