2013-08-27 6 views
11

अगर यह @Html.MyHelperFor(m => m.MailID) है यह लौटना चाहिए मैं एक सहायक की तरहबनाना कस्टम HTML हेल्पर: MyHelperFor

@Html.MyHelperFor(m => m.Name) 

इस्तेमाल किया जा सकता बनाने के लिए चाहते हैं इस उदाहरण

<span name="Name" data-something="Name"></span>

के लिए वापस आ जाएगी

<span name="MailID" data-something="MailID"></span>

मुझे इस तरह के सहायक बनाने के लिए सहायक विधि में संपत्ति का नाम एक्सेस करने में सक्षम होना चाहिए, मुझे लगता है।

मैं यह कैसे कर सकता हूं?

उत्तर

18

आप कुछ ऐसा कर सकते हैं (निम्नलिखित अतिरिक्त HTML विशेषताओं को भी लेंगे)।

public static MvcHtmlString MyHelperFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null) 
{ 
    var data = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    string propertyName = data.PropertyName; 
    TagBuilder span = new TagBuilder("span"); 
    span.Attributes.Add("name", propertyName); 
    span.Attributes.Add("data-something", "something"); 

    if (htmlAttributes != null) 
    { 
     var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
     span.MergeAttributes(attributes); 
    } 

    return new MvcHtmlString(span.ToString()); 
} 
+3

मदद की है यह नामस्थान * System.Web.Mvc.Html * के तहत एक स्थिर वर्ग के अंदर जोड़ा जाना चाहिए। – BornToCode

+0

@ बोर्नटोकोड आप जानते हैं, मैं उनके द्वारा संदर्भित प्रकार के नामस्थान के तहत लिखे गए एक्सटेंशन को अधिक पसंद करता हूं, अन्यथा अन्य डेवलपर्स कभी भी उनका उपयोग नहीं करते हैं, अगर वे उन्हें नहीं जानते हैं क्योंकि उन्हें उनके बारे में और नामस्थान के बारे में जानना होगा एक संदर्भ जोड़ने और इसका उपयोग करने के लिए रहते हैं। – mattytommo

+0

प्रश्न डेटा-कुछ = "मेलआईडी" के लिए पूछा गया जहां आपका इसे "कुछ" पर सेट करता है।उदाहरण को यह दिखाने की ज़रूरत है कि अभिव्यक्ति के मूल्य को कैसे प्राप्त किया जाए, न केवल संपत्ति का नाम। – xr280xr

2

यह आपको शुरू करना चाहिए। यह फ़ंक्शन सीधे संपत्ति का नाम देता है लेकिन आपको इसे उस छोटे से काम में बदलने के लिए सक्षम होना चाहिए जिसे आप ढूंढ रहे हैं। इस उदाहरण में आपकी विधि का नाम प्राप्त करने के लिए सही विधि हस्ताक्षर और अभिव्यक्ति हेल्पर पर कॉल है।

public static MvcHtmlString MyHelperFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression) 
    { 
     string expressionName = ExpressionHelper.GetExpressionText(expression); 

     return new MvcHtmlString(expressionName); 
    } 
+0

इस anser ने मुझे –

5

आप ModelMetadata इस तरह से FromLambaExpression विधि का उपयोग कर सकते हैं:

namespace System.Web.Mvc.Html 
{ 
    public static class CustomHelpers 
    { 
     public static MvcHtmlString MyHelperFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
     { 
      var metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
      var name = metaData.PropertyName; 
      // create your html string, you could defer to DisplayFor to render a span or 
      // use the TagBuilder class to create a span and add your attributes to it 
      string html = ""; 
      return new MvcHtmlString(html); 
     } 
    } 
} 

ModelMetadata वर्ग System.Web.Mvc नाम स्थान में है। FromLambdaExpression विधि है जो निर्मित सहायकों का उपयोग करती है, इसलिए आप सुनिश्चित कर सकते हैं कि आपका सहायक बिल्ट इन हेल्पर्स के समान कार्य करेगा। CustomHelpers कक्षा System.Web.Mvc.Html नामस्थान के अंदर रखकर आप अपने सहायक का उपयोग कर सकते हैं जैसे कि आप अन्य सहायक, यानी @Html.MyHelperFor()

1

mattytommo के जवाब पर के बाद, इस महान काम करता है लेकिन वहाँ केवल एक छोटा सा समस्या है जब इस तरह के आप एक EditorTemplate अंदर एक संपत्ति के लिए इस कोड का उपयोग कर रहे हैं के रूप में जटिल वस्तुओं, के साथ प्रयोग किया है।

इसके बजाय

var data = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
string propertyName = data.PropertyName; 

MVC4 का उपयोग कर के, आप इसे

var propertyName = helper.NameFor(expression); 

करने के लिए या MVC3 के लिए और नीचे बदल सकते हैं

var propertyName = expression.Body.ToString(); 
propertyName = propertyName.Substring(propertyName.IndexOf(".") + 1); 
if (!string.IsNullOrEmpty(helper.ViewData.TemplateInfo.HtmlFieldPrefix)) 
    propertyName = string.Format("{0}.{1}", helper.ViewData.TemplateInfo.HtmlFieldPrefix, propertyName); 

पूर्ण कोड:

public static MvcHtmlString MyHelperFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null) 
    { 
     var propertyName = expression.Body.ToString(); 
     propertyName = propertyName.Substring(propertyName.IndexOf(".") + 1); 
     if (!string.IsNullOrEmpty(helper.ViewData.TemplateInfo.HtmlFieldPrefix)) 
      propertyName = string.Format("{0}.{1}", helper.ViewData.TemplateInfo.HtmlFieldPrefix, propertyName); 

     TagBuilder span = new TagBuilder("span"); 
     span.Attributes.Add("name", propertyName); 
     span.Attributes.Add("data-something", propertyName); 

     if (htmlAttributes != null) 
     { 
      var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
      span.MergeAttributes(attributes); 
     } 

     return new MvcHtmlString(span.ToString()); 
    } 
संबंधित मुद्दे