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



0 Answers

إذا قمت بتحليل فئة 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

Question

أقرأ كتابًا على 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 ، لأن الويب عديم الجنسية. هل هذا هو الحال؟




Related