এএসপি.নেট এমভিসি-তে ভিউব্যাগ কীভাবে কাজ করে


102

এএসপি.এনইটি এমভিসির কীভাবে ViewBagকাজ করে? এমএসডিএন বলছে এটি কেবল একটি Object, যা আমাকে চক্রান্ত করে, "ম্যাজিক" বৈশিষ্ট্যগুলি যেমন ViewBag.Fooএবং যাদু স্ট্রিংগুলি ViewBag["Hello"]আসলে কীভাবে কাজ করে?

এছাড়াও, আমি কীভাবে এটি তৈরি করতে পারি এবং এটি আমার এএসপি.নেট ওয়েবফোর্স অ্যাপ্লিকেশনটিতে ব্যবহার করব?

উদাহরণগুলি সত্যিই প্রশংসা হবে!


ওয়েবফোর্ডে ধারণার প্রয়োজন মনে হয় না কারণ ফাইলটির পেছনের কোডটিতে পৃষ্ঠাটির ইতিমধ্যে ভেরিয়েবলের সরাসরি অ্যাক্সেস রয়েছে। এমভিসি-তে ভিউব্যাগ বা মডেলটি দেখায় পাস করা ডেটা বাদে নিয়ন্ত্রকের কোনও কিছুতে ভিউয়ের অ্যাক্সেস থাকে না।
রিচার্ড ডাল্টন

উত্তর:


91

ViewBagধরণের dynamicতবে এটি অভ্যন্তরীণভাবে একটিSystem.Dynamic.ExpandoObject()

এটি এভাবে ঘোষণা করা হয়েছে:

dynamic ViewBag = new System.Dynamic.ExpandoObject();

যে কারণে আপনি এটি করতে পারেন:

ViewBag.Foo = "Bar";

একটি নমুনা বিস্তৃত অবজেক্ট কোড:

public class ExpanderObject : DynamicObject, IDynamicMetaObjectProvider
{
    public Dictionary<string, object> objectDictionary;

    public ExpanderObject()
    {
        objectDictionary = new Dictionary<string, object>();
    }
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        object val;
        if (objectDictionary.TryGetValue(binder.Name, out val))
        {
            result = val;
            return true;
        }
        result = null;
        return false;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        try
        {
            objectDictionary[binder.Name] = value;
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

4
অদ্ভুত যে এটি public object ViewBag { get; }ভিউব্যাগের জন্য এমএসডিএন পৃষ্ঠায় কেবল বলেছেন , তবে আমি আপনার দাবিটি কিনছি যে এটি একটিExpandoObject । আমি এখানে ভিউডাটার সাথে তুলনা পছন্দ করি : " সুতরাং মূলত [ভিউব্যাগ] ম্যাজিক স্ট্রিংগুলি [ভিউডাটাতে] ... যাদু বৈশিষ্ট্যের সাথে প্রতিস্থাপন করে "। ;।)
রাফিন

এমআরডিএন- public object ViewBag { get; }তে @ আরফিন অদ্ভুতভাবে বলেছেন যে কোডটি বলেছে যে এটি dynamic ViewBag { get .. অভ্যন্তরীণভাবে ডায়নামিকভিউডাটা
অনিকেত ইনজে

খুব সুন্দর । এটি খনন করার জন্য ধন্যবাদ। এবং আমি +1 করেছি এবং বলেছি যে আমি আপনাকে বিশ্বাস করেছি! ; ^)
রাফিন

4
আরেকটি ক্ষেত্রে @ruffin যখন ডকুমেন্টেশন মিথ্যা এবং কোড কখনো মিথ্যা
Aniket Inge

কখনও পরিষ্কার / মিশ্র প্রশ্নের মতো সঠিক উত্তরগুলি খুঁজে পাওয়ার সময় আমি মুগ্ধ হই। ধন্যবাদ!
অস্কার অর্টিজ

33

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

আপনি যদি ওয়েব ফর্মগুলির জন্য এটি ব্যবহার করতে চান, তবে বেস পৃষ্ঠার শ্রেণীর মতো একটি গতিশীল সম্পত্তি যুক্ত করুন:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

আপনার সমস্ত পৃষ্ঠাগুলি এ থেকে উত্তরাধিকারী হোন। আপনার ASP.NET মার্কআপে, আপনার সক্ষম হওয়া উচিত:

<%= ViewBagProperty.X %>

এটা কাজ করা উচিত। যদি তা না হয় তবে তার চারপাশে কাজ করার উপায় রয়েছে।


আমি জানি ভিউব্যাগটি কী, আমি ওয়েবফর্মগুলিতে কীভাবে কোনও অবজেক্ট তৈরি করতে হয় তা জানতে চাই, যার অর্থ আমি এটি হ্যান্ড-কোড করতে চাই।
অনিকেত ইনজে

একটি বাস্তবায়ন সঙ্গে উপরে আপডেট।
ব্রায়ান মেইন

8

ViewBagএকটি হল System.Dynamic.ExpandoObjectযেমন সুপারিশ করেছে। এর বৈশিষ্ট্যগুলি ViewBagমূলত KeyValueজোড়া, যেখানে আপনি কী দ্বারা মানটি অ্যাক্সেস করেন। এই অর্থে এগুলি সমতুল্য:

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";

আমি জানি ভিউব্যাগটি কী, আমি ওয়েবফর্মগুলিতে কীভাবে কোনও অবজেক্ট তৈরি করতে হয় তা জানতে চাই, যার অর্থ আমি এটি হ্যান্ড-কোড করতে চাই।
অনিকেত ইনজে

@ অ্যানিকেট আপনার ওয়েব ফর্মগুলিতে একটি ভিউস্টেট রয়েছে।
কনস্ট্যান্টিন দিনভ

5

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

উদাহরণস্বরূপ: ১. ভিউব্যাগ তৈরি করা: ভিউব্যাগ.প্রথম নাম = "জন";

  1. অ্যাক্সেস ভিউ: @ ভিউব্যাগ.ফার্সনেম।

3

ভিউব্যাগ টাইপ গতিশীল। আরও, আপনি করতে পারবেন না ViewBag["Foo"]। আপনি ব্যতিক্রম পাবেন - 'সিস্টেম.ডায়নামিকডায়নামিকঅবজেক্ট' টাইপের অভিব্যক্তিতে [] এর সাথে সূচীকরণ প্রয়োগ করতে পারবেন না

অভ্যন্তরীণ বাস্তবায়ন ViewBagফুগুলিকে সঞ্চয় করেViewData["Foo"] ফুগুলিকে (ভিউডাটাডাডিয়ের অভিধানের ধরণের) , সুতরাং সেই 2 টি বিনিময়যোগ্য। ViewData["Foo"]এবং ViewBag.Foo

এবং সুযোগ। ভিউব্যাগ এবং ভিউ ডেটা কন্ট্রোলারের ক্রিয়াকলাপগুলির মধ্যে ডেটা পাস করা এবং এটি রেন্ডারগুলি দেখায় ment


0

ভিউব্যাগ একটি গতিশীল প্রকার যা আপনাকে গতিশীলভাবে সেট করতে বা মানগুলি পেতে দেয় এবং দৃ typ়-টাইপযুক্ত শ্রেণি ব্যতীত আপনাকে কোনও অতিরিক্ত ক্ষেত্রের সংখ্যা যুক্ত করার অনুমতি দেয় তারা আপনাকে নিয়ন্ত্রণকারীর থেকে দেখার জন্য ডেটা পাস করার অনুমতি দেয়। নিয়ামক ......

public ActionResult Index()
{
    ViewBag.victor = "My name is Victor";
    return View();
}

দেখুন

@foreach(string a in ViewBag.victor)
{
     .........
}

আমি যেটা শিখেছি তা হ'ল উভয়েরই সেভ ডায়নামিক নাম সম্পত্তি থাকা উচিত ভিউব্যাগ.ভিক্টর


-1
public dynamic ViewBag
{
    get
    {
        if (_viewBag == null)
        {
            _viewBag = new DynamicViewData(() => ViewData);
        }

        return _viewBag;
    }
}

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