c# area - كيف يعمل تطبيق ViewBag في ASP.NET MVC خلف الكواليس؟




in tutorial (4)

إذا قمت بتحليل فئة ControllerBase سترى أن الخاصية ViewBag هي "وكيل" خاصية ViewData فقط لجعل المصدر الخاص بك يبدو أجمل. (حتى أتذكر سكوت هانسلمان الذي أخذ مقابلة من فيل هاك حيث قدم فيل خاصية ViewBag كاختصار لـ ViewData وإلغاء الحاجة إلى الأقواس المربعة والاقتباسات المتكررة). على الرغم من أنه يتم عرض الخاصية ViewBag ككائن dynamic فإنها تطبق فئة DynamicViewDataDictionary التي تعمل مباشرة مع ViewData.

بالنظر إلى شفرة المصدر الخاصة بفئة Controller يمكنك العثور على هذه الطريقة:

protected internal virtual ViewResult View(string viewName, string masterName, object model)

وذلك أساسا عند استدعاء return View(); من وحدة التحكم الخاصة بك فإنه ينشئ مثيل جديد من فئة ActionResult تمرير ActionResult من وحدة تحكم إلى منشئ. ثم يتم تمرير مثيل ActionResult إلى مشغل عرض معين (ASPX ، Razor) بحيث يمكن استخدامه لتقديم طريقة عرض في السؤال.

قد يجعل جعل ViewBag / ViewData جمهوريًا ضارًا. كل طلب على شبكة الإنترنت إلى تطبيق MVC الخاص بك يخلق حالة جديدة من وحدة التحكم. إذا كان لديك ViewData / ViewBag كمستهدف للجمهور ، فسيشترك مستخدمان متزامنان في نفس البيانات من ViewBag / ViewData.

Here فيديو. تبدأ مناقشة ViewBag (منشئ ViewModel) في الساعة 04:05

أقرأ كتابًا على ASP.NET MVC وأتساءل كيف يعمل المثال التالي:

مثال 1

مراقب

public class MyController : Controller
{
    public ActionResult Index()
    {
        ViewBag.MyProperty = 5;

        return View();
    }
}

رأي

<h1>@ViewBag.MyProperty</h1>

الآن أنا أفهم أن ViewBag هو كائن ديناميكي ، لذلك كيف يمكنك تعيين الخاصية (على الرغم من أنني لا أعرف الكثير عن الكائنات الديناميكية ، ولم أعمل معهم.) ولكن كيف تحصل طريقة العرض على مثيل معين من ViewBag من تحكم ، على الرغم من أننا لا يمر أي شيء مباشرة؟

اعتقدت أن ViewBag يمكن أن يكون كائنًا public static ، ولكن أي تغيير عليه سيكون عالميًا ولن يكون محددًا ViewBag المشاهدة.

هل يمكنك توضيح كيف يعمل هذا خلف الكواليس؟

المثال رقم 2

مراقب

public class MyController : Controller
{
    public ActionResult Index()
    {
        ViewBag.MyProperty = 5;

        return View();
    }

    public ActionResult Index2()
    {
        ViewBag.MyProperty = 6;

        return View();
    }
}

لنفترض الآن أن طريقة Index تسمى أولاً ، ثم Index2 . في النهاية ستنتهي قيمة ViewBag.MyProperty كـ 6 (القيمة من Index2 ). أشعر أنه ليس من الجيد القيام به ، ولكن في الوقت نفسه أشعر أنني أفكر في شروط تطوير سطح المكتب. ربما لا يهم عند استخدامها مع ASP.NET MVC ، لأن الويب عديم الجنسية. هل هذا هو الحال؟


ViewBag هي خاصية من ControllerBase ، والتي يجب أن ترث من جميع وحدات التحكم. إنه كائن dynamic ، ولهذا السبب يمكنك إضافة خصائص جديدة إليه دون الحصول على أخطاء وقت في الترجمة.

انها ليست static ، انها عضو في الكائن. أثناء عمر الطلب ، يتم إنشاء مثيل جهاز التحكم والتخلص منه ، لذلك لن يكون لديك مشكلات "التزامن" ، مثل الكتابة فوق القيمة.

View (والمتغيرات الخاصة بها) ليست static أيضًا ، وهذه هي الطريقة التي يتلقى بها ViewBag قيم ViewBag : أثناء عملية تقديم العرض ، يكون لمثيل جهاز التحكم مثيله في ViewBag أيضًا.


ViewBag هي خاصية من ControllerBase . يتم تعريفه على النحو التالي:

public Object ViewBag { get; }

لاحظ أن هذا التوقيع غير صحيح في الواقع. إليك ما تبدو عليه شفرة المصدر فعليًا:

public dynamic ViewBag {
        get {
            if (_dynamicViewDataDictionary == null) {
                _dynamicViewDataDictionary = new DynamicViewDataDictionary(() => ViewData);
            }
            return _dynamicViewDataDictionary;
        }
    }

_dynamicViewDataDictionary هو ExpandoObject؛ يمكنك إضافة خصائص إليها في وقت التشغيل. عمرها هو نفس جهاز التحكم ، وهو عمر طلب HTTP.


@Html.DropDownListFor(model => model.MaritalStatus, new List<SelectListItem> 
{  

new SelectListItem { Text = "----Select----", Value = "-1" },


new SelectListItem { Text = "Marrid", Value = "M" },


 new SelectListItem { Text = "Single", Value = "S" }

})




c# asp.net-mvc dynamic viewbag