সৃষ্টির পরে বেনামে ধরণের সম্পত্তি যুক্ত করুন


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

কবজির মতো কাজ করে, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! বিটিডাব্লু: আপনি যদি এখনও অবধি অ্যাকশনলিঙ্ক () এর অবজেক্টটি ওভারলোডগুলি ব্যবহার করেন তবে সঠিক ওভারলোডটি কল করার জন্য আপনাকে এইচটিএমএলএলটিউবটি HtmlHelper.AnonymousObjectToHtmlAttributes (htmlAttributes) দিয়ে মুড়ে রাখতে হবে!
ডিআর

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% সঠিক। যদিও আপনি সাধারণত এইচটিএমএল বৈশিষ্ট্যের জন্য বেনামে প্রকারগুলি ব্যবহার করেন, এটি আসলে একটি আইডোরিয়াস <স্ট্রিং, অবজেক্ট> এবং তাই আপনি এটি থেকে সহজেই যোগ / মুছতে পারেন।
পিটার মুনিংস 20'12

12
msdn.microsoft.com/en-us/library/... একই জিনিস আছে, কিন্তু এটা System.Web.Mvc.HtmlHelper মধ্যে নির্মিত।
মীর

1
কেন টোডেয়ার অভিধান জনসাধারণ এবং ব্যক্তিগত নয়, এই পদ্ধতিটি প্রকাশ করার কোনও অর্থ হয় না?
প্রোগ্রামিংয়ের অধ্যাপক

52

আমি ধরে নিলাম এখানে আপনার বেনামে প্রকারের অর্থ, যেমন new { Name1=value1, Name2=value2} ইত্যাদি, যদি তাই হয় তবে আপনার ভাগ্যের বাইরে anonym বেনামে টাইপগুলি সাধারণ সংকলন যা তারা স্থির, সংকলিত কোড। এগুলি কেবল অটোজেনারেটেড হওয়ার ঘটনা ঘটে।

আপনি যা করতে পেরেছিলেন তা লিখতে হয় 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){}

এটি পাঠ্যবক্সের আইডি মানটি গ্রহণ করবে এবং লেবেলটি উল্লেখ করা উচিত। গ্রাহকরা যদি এখন "আইডি" বৈশিষ্ট্যটিকে পাঠ্যবক্সএইচটিএমএল বিজ্ঞাপনগুলিতে অন্তর্ভুক্ত না করেন তবে পদ্ধতিটি একটি ভুল লেবেল তৈরি করবে।

এই বৈশিষ্ট্যটি লেবেলটি এইচটিএমএলঅ্যাট্রিবিউটস অবজেক্টে যুক্ত করা থাকলে আমি প্রতিবিম্বের মাধ্যমে পরীক্ষা করতে পারি। যদি তা হয় তবে আমি এটি যুক্ত করতে বা এটি যুক্ত করা একটি নতুন বেনামে তৈরি করতে চাই। তবে যেহেতু আমি পুরানো গুণাবলীর মধ্য দিয়ে চলতে এবং নিজের "আইডি" বৈশিষ্ট্য যুক্ত করে কোনও নতুন বেনামি ধরণের তৈরি করতে পারি না, আমি একরকম আটকে রয়েছি।

দৃ container়ভাবে টাইপ করা আইডি সম্পত্তি সহ একটি ধারক এবং তারপরে একটি বেনামে টাইপ করা "অ্যাট্রিবিউটস" বৈশিষ্ট্যটির জন্য কোড পুনর্লিখনের প্রয়োজন হবে যা "আইডি ফিল্ড যোগ করুন" প্রয়োজনীয়তার চেয়ে বেশি হবে না।

আশা করি এই প্রতিক্রিয়াটি বোধগম্য। এটা দিনের শেষ, আমার মস্তিষ্ক আর লাইনে পাওয়া যাবে না ..


ভাল ... আপনি একটি নতুন ধরণের তৈরি করতে পারেন (কোডডোম ইত্যাদি সহ) এতে প্রাসঙ্গিক বৈশিষ্ট্য রয়েছে। তবে কোডটি নরক হিসাবে কুৎসিত হবে। আমি কি প্রস্তাব দিতে পারি যে কোনও বস্তু নেওয়ার এবং প্রতিবিম্বের মাধ্যমে বৈশিষ্ট্যগুলি দেখার পরিবর্তে আপনি একটি আইডিকেয়ার <স্ট্রিং, স্ট্রিং> বা অন্য কিছু নেবেন? (অবিরত)
জন স্কিটি

আপনি সেই অভিধানটি কোনও সহায়ক পদ্ধতির সাহায্যে তৈরি করতে পারেন যা পুরো প্রতিফলনের কাজটি করেছিল - এবং সম্ভবত একটি মোড়ক পদ্ধতি রয়েছে যা সুনির্দিষ্টভাবে করেছে - তবে একটি অভিধানের মতো মনে হচ্ছে এটি সত্যই আপনি যেভাবে উপস্থাপন করতে চাইছেন তার কাছাকাছি; বেনামে অবজেক্ট ইনিশিয়ালাইজারগুলি কেবল সিনট্যাক্টিকাল হ্যান্ডিল।
জন স্কিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.