2012-03-09 17 views
6

कहा जाता है मैंने गुणों को मेटाडेटा संलग्न करने के लिए विशेषता वर्ग बनाया है, इसलिए मैं फ़ॉर्म के इनपुट फ़ील्ड के लिए टूलटिप्स प्रदर्शित कर सकता हूं।IMetadataAware.OnMetadataCreated को कभी भी

HelpAttributeIMetadataAware लागू करता है:

Public Class HelpAttribute 
    Inherits Attribute 
    Implements System.Web.Mvc.IMetadataAware 

    Public Sub New(text As String) 
     _text = text 
    End Sub 

    Private _text As String 
    Public ReadOnly Property Text As String 
     Get 
      Return _text 
     End Get 
    End Property 

    Public Sub OnMetadataCreated(metadata As System.Web.Mvc.ModelMetadata) Implements System.Web.Mvc.IMetadataAware.OnMetadataCreated 
     metadata.AdditionalValues.Add("HelpText", _text) 
    End Sub 
End Class 

मुझे अपने एक्सटेंशन विधि में इस मेटाडाटा का उपयोग:

<Extension()> 
Public Function HelpFor(Of TModel, TProperty)(ByVal htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TProperty))) As MvcHtmlString 
    Dim metaData = ModelMetadata.FromLambdaExpression(Of TModel, TProperty)(expression, htmlHelper.ViewData) 

    If metaData.AdditionalValues.ContainsKey("HelpText") Then 
     Dim helpText = metaData.AdditionalValues("HelpText") 
     Return MvcHtmlString.Create(String.Format("<span class=""help""></span><div class=""tooltip"" style=""display: none""><div class=""border-top""></div><div class=""close""><a href=""#"">close</a></div><br class=""clear""><div class=""content"">{1}</div></div>", htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(metaData.PropertyName), helpText, metaData.DisplayName)) 
    End If 

    Return MvcHtmlString.Create(String.Format("<span class=""no_help""></span>", htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(metaData.PropertyName), metaData.DisplayName)) 
End Function 

तो मैं अपने मॉडल के गुणों में से किसी के लिए Html.HelpFor कॉल कर सकते हैं और मैं प्रदर्शित करता है, तो यह उचित मेटाडाटा है एक सहायता आइकन जो क्लिक (जेएस) पर टूलटिप दिखाता है।

यह सब ठीक काम करता है जब तक HelpAttribute उसी वर्ग में परिभाषित किया जाता है, जिसे मैं अपनी संपत्तियों को सजाने के साथ करता हूं। आज मुझे HelpAttribute को एक अलग डीएल (अलग-अलग नेमस्पेस) में स्थानांतरित करना पड़ा, इसलिए मैंने ऐसा किया, मैंने परियोजना का संदर्भ दिया और इसे काम करने की उम्मीद की। मुझे कोई कंपाइलर त्रुटियां नहीं मिलती हैं, ऐप ठीक काम करता है, लेकिन यह सहायता आइकन प्रदर्शित नहीं करता है। मैंने कोड डीबग किया और मुझे लगता है कि HelpAttribute के कन्स्ट्रक्टर को उचित टेक्स्ट के साथ अलग-अलग गुणों के लिए बुलाया जाता है, लेकिन OnMetadataCreated कभी नहीं कहा जाता है। क्या किसी के पास कोई विचार है कि यह क्यों है और इसे कैसे ठीक किया जाए?

उत्तर

2

एक बार फिर मैं अपने प्रश्न का उत्तर दूंगा। स्पष्ट रूप से एसओ पर चीजें पोस्ट करने से मुझे अपने सिर में समस्या का निर्माण करने में मदद मिलती है। जब मैंने एक अलग वर्ग पुस्तकालय में HelpAttribute स्थानांतरित किया तो मुझे IMetadataAware इंटरफ़ेस के लिए System.Web.Mvc का संदर्भ देना पड़ा। मैं .NET 4.0 का उपयोग करता हूं और मैंने स्वचालित रूप से एमवीसी 4 का संदर्भ दिया है जिसे मैंने परीक्षण उद्देश्यों के लिए कुछ समय पहले स्थापित किया था। मुझे कोई त्रुटि नहीं मिली, यह अभी काम नहीं कर सका। जब मैंने System.web.Mvc को ver में बदल दिया। 3.0 सब कुछ सुचारू रूप से काम करता है।

-2
using System; 
    using System.Collections.Generic; 
    using System.Globalization; 
    using System.Web; 
    using System.Web.Mvc; 

    namespace ColorPickerAttributeExample.Attributes 
    { 
     [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
     public sealed class ColorPickerAttribute : Attribute, IMetadataAware 
     { 
      private const string Template = 
       "$('#{0}').ColorPicker({{onSubmit: function(hsb, hex, rgb, el) {{" + 
       "var self = $(el); self.val(hex);self.ColorPickerHide();}}, onBeforeShow: function() " + 
       "{{$(this).ColorPickerSetColor(this.value);}}}}).bind('keyup', function(){{ $(this).ColorPickerSetColor(this.value); }});"; 

      public const string ColorPicker = "_ColorPicker"; 

      private int _count; 

      // if using IoC container, you could inject this into the attribute 
      internal HttpContextBase Context 
      { 
       get { return new HttpContextWrapper(HttpContext.Current); } 
      } 

      public string Id 
      { 
       get { return "jquery-colorpicker-" + _count; } 
      } 

      #region IMetadataAware Members 

      public void OnMetadataCreated(ModelMetadata metadata) 
      { 
       IList<string> list = Context.Items["Scripts"] as IList<string> ?? new List<string>(); 
       _count = list.Count; 

       metadata.TemplateHint = ColorPicker; 
       metadata.AdditionalValues[ColorPicker] = Id; 

       list.Add(string.Format(CultureInfo.InvariantCulture, Template, Id)); 

       Context.Items["Scripts"] = list; 
      } 

      #endregion 
     } 
    } 



    using ColorPickerAttributeExample.Attributes; 
    using System; 

    namespace ColorPickerAttributeExample.Models 
    { 
     public class HomeModel 
     { 
      [ColorPicker] 
      public string ColorPicker { get; set; } 
      [ColorPicker] 
      public DateTime ColorPicker2 { get; set; } 
     } 
    } 


@model dynamic 

@{ 
    var picker = ViewData.GetModelAttribute<ColorPickerAttribute>(); 
    if (picker != null) 
    { 
     @Html.LabelForModel() 
     @Html.TextBoxFor(m => m, new {id = ViewData.ModelMetadata.AdditionalValues[ColorPickerAttribute.ColorPicker]}) 
    } 
} 
+0

का उपयोग करना चाहिए कोड यहां पोस्ट प्रश्न पूछा से संबंधित नहीं है, यह संदर्भ के लिए कोई विचार के साथ सिर्फ एक बॉयलरप्लेट विशेषता है ओपी की समस्या का। यहां तक ​​कि अगर कोड कुछ उपयोग के लिए किया गया था - यह केवल कुछ भी स्पष्टीकरण के बिना अनावश्यक रूप से डंप किया जाना चाहिए और यह मूल प्रश्न का उत्तर कैसे देता है। – RobD

13

एक और कारण यह नहीं कहा जा सकता है कि यदि आपके पास गलत नामस्थान संदर्भित है। तो

using System.Web.ModelBinding; 

संकलित कर देगा और नहीं मारा जाएगा, लेकिन आप

using System.Web.Mvc; 
+0

धन्यवाद! मैं कल्पना नहीं करना चाहता कि यह मुझे समझने में कितना समय लगेगा। – Gerino

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