सृजन के बाद संपत्ति को गुमनाम प्रकार में जोड़ें


101

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

मैं इस अनाम ऑब्जेक्ट में एक विशेषता कैसे जोड़ सकता हूं?

जवाबों:


17

यदि आप इस विधि को बढ़ाने का प्रयास कर रहे हैं:

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);

हालांकि मुझे यकीन है कि खाजा के ऑब्जेक्ट एक्सटेंशन काम करेंगे, आप रूटवैल्यूड्रैड बनाकर और रूटवैल्यूज ऑब्जेक्ट में पास करके बेहतर प्रदर्शन प्राप्त कर सकते हैं, कॉन्टेक्ट से अपने अतिरिक्त मापदंडों को जोड़ सकते हैं, फिर एक्शनलिंक ओवरलोड का उपयोग करके वापस लौट सकते हैं जो एक ऑब्जेक्ट के बजाय एक रूटवैल्यूबर्ड लेता है:

यह काम कर जाना चाहिए:

    public static MvcHtmlString MyLink(this HtmlHelper helper, string linkText, string actionName, object routeValues)
    {
        RouteValueDictionary routeValueDictionary = new RouteValueDictionary(routeValues);

        // Add more parameters
        foreach (string parameter in helper.ViewContext.RequestContext.HttpContext.Request.QueryString.AllKeys)
        {
            routeValueDictionary.Add(parameter, helper.ViewContext.RequestContext.HttpContext.Request.QueryString[parameter]);
        }

        return helper.ActionLink(linkText, actionName, routeValueDictionary);
    }

एक आकर्षण की तरह काम करता है, यह स्वीकृत उत्तर होना चाहिए! BTW: यदि आप अभी तक ActionLink () के ऑब्जेक्ट ओवरलोड का उपयोग कर रहे हैं, तो आपको सही अधिभार को कॉल करने के लिए HTMLAttributes को HtmlHelper.AnonymousObjectToHtmlAttributes (htmlAttributes) के साथ लपेटना होगा!
DR

79

निम्नलिखित विस्तार वर्ग आपको वह मिलेगा जो आपको चाहिए।

public static class ObjectExtensions
{
    public static IDictionary<string, object> AddProperty(this object obj, string name, object value)
    {
        var dictionary = obj.ToDictionary();
        dictionary.Add(name, value);
        return dictionary;
    }

    // helper
    public static IDictionary<string, object> ToDictionary(this object obj)
    {
        IDictionary<string, object> result = new Dictionary<string, object>();
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);
        foreach (PropertyDescriptor property in properties){
            result.Add(property.Name, property.GetValue(obj));
        }
        return result;
    }
}

4
100% सही है। भले ही आम तौर पर आप Html Attributes के लिए अनाम प्रकारों का उपयोग करते हैं, यह वास्तव में एक IDEDIA <string, object> है और इसलिए आप इसमें आसानी से जोड़ / हटा सकते हैं।
पीटर मुनिंग्स

12
msdn.microsoft.com/en-us/library/… एक ही काम करता है, लेकिन यह System.Web.Mvc.HtmlHelper में बनाया गया है।
मीर

1
सार्वजनिक रूप से टोब्रोब क्यों और निजी नहीं है, इस विधि को उजागर करने का कोई मतलब नहीं है?
प्रोग्रामिंग

52

मुझे लगता है कि आप गुमनाम प्रकारों का मतलब यहाँ पर रखते हैं, जैसे new { Name1=value1, Name2=value2}आदि। यदि हां, तो आप भाग्य से बाहर हैं - अनाम प्रकार सामान्य प्रकार हैं जिसमें वे तय किए गए, संकलित कोड हैं। वे सिर्फ आत्मकेंद्रित होने के लिए होते हैं।

आप जो कर सकते थे वह लिख रहे हैं, new { old.Name1, old.Name2, ID=myId }लेकिन मुझे नहीं पता कि वास्तव में आप क्या चाहते हैं। स्थिति पर कुछ और विवरण (कोड नमूने सहित) आदर्श होंगे।

वैकल्पिक रूप से, आप एक कंटेनर ऑब्जेक्ट बना सकते हैं जिसमें हमेशा एक आईडी होती है और जो भी अन्य ऑब्जेक्ट बाकी गुणों को समाहित करता है।


-1
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}

यह उस मान को स्वीकार करेगा जो टेक्स्टबॉक्स में होना चाहिए और लेबल को संदर्भित होना चाहिए। यदि उपभोक्ता अब टेक्स्ट आईडी में "id" प्रॉपर्टी शामिल नहीं करता है, तो यह एक गलत लेबल बना देगा।

मैं प्रतिबिंब के माध्यम से जाँच कर सकता हूं कि क्या यह विशेषता लेबलहेटलमीट्यूएंट ऑब्जेक्ट में जोड़ी गई है। यदि हां, तो मैं इसे जोड़ना चाहता हूं या एक नई अनाम वस्तु बनाना चाहता हूं जो इसे जोड़ा है। लेकिन क्योंकि मैं पुरानी विशेषताओं के माध्यम से चलने और अपनी खुद की "आईडी" विशेषता जोड़कर एक नया अनाम प्रकार नहीं बना सकता, इसलिए मैं एक प्रकार का अटक गया हूं।

एक दृढ़ता से टाइप की गई आईडी प्रॉपर्टी वाला एक कंटेनर और फिर एक अनाम टाइप की गई "विशेषताएँ" प्रॉपर्टी में कोड रीराइट करने की आवश्यकता होती है, जो "ऐड फ़ील्ड जोड़ने" की आवश्यकता नहीं है।

आशा है कि यह प्रतिक्रिया समझ में आएगी। यह दिन का अंत है, मेरे दिमाग को अब लाइन में नहीं मिल सकता है।


खैर ... आप एक नया प्रकार (कोडडॉम आदि के साथ) बना सकते हैं जिसमें प्रासंगिक गुण थे। लेकिन कोड नरक के रूप में बदसूरत होगा। क्या मैं सुझाव दे सकता हूं कि एक वस्तु लेने और प्रतिबिंब के माध्यम से गुणों को देखने के बजाय, आप एक IDEDIA <string, string> या कुछ और लेते हैं? (जारी)
जॉन स्कीट

आप उस शब्दकोश को एक सहायक विधि के साथ बना सकते हैं, जिसने पूरी प्रतिबिंब बात की - और संभवतः एक आवरण विधि है जो ठीक-ठीक किया - लेकिन एक शब्दकोश ऐसा लगता है जैसे आप वास्तव में प्रतिनिधित्व करने की कोशिश कर रहे हैं; अनाम ऑब्जेक्ट इनिशियलाइज़र बस सिंटैक्टिक रूप से काम कर रहे हैं।
जॉन स्कीट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.