تعلم ASP.NET MVC


الدرس: السقالات Scaffolding


الصفحة السابقة
بالنسبة لهذا الفصل ، لن نعمل على تطبيقنا السابق. أنت محبط ، أنا أفهمك. ولكن لا تزال سعيدًا ، لأن السقالات ستبسط مهمتك اليومية.
السقالات هي قدرة Visual Studio و ASP.NET MVC على إنشاء تعليمات برمجية متكررة لإنشاء الأشياء وقراءتها وتحديثها وحذفها في تطبيقك. من خلال تحليل نموذجك ، يستطيع Visual Studio استنتاج الحقول التي ستحتاج إليها لإنشاء نماذج كلاسيكية وإنشاء إجراءات وحدة تحكم.
في الواقع ، كان بإمكاننا استخدام Scaffolding لتطبيقنا السابق ، لكنني فضلت أن أوضح لك كيفية القيام بكل شيء من الألف إلى الياء حتى تتمكن من فهم الآليات المتأصلة في إنشاء تطبيقات ASP.NET MVC .
ضع في اعتبارك أن السقالات لن تسمح لك بإنشاء تطبيق. ببساطة ، سيوفر لك الوقت في تطوراتك.

مشروع اختبار


لتجنب إفساد تطبيقنا السابق الجميل ، سأقوم بإنشاء مشروع مؤقت أسميه DemoScaffold لتوضيح كيفية عمل كل شيء. بالطبع ، سيكون تطبيقًا فارغًا حيث سنقوم بفحص MVC .
أول شيء فعله ، سأضيف النموذج الذي أنشأناه لتطبيقنا السابق في هذا التطبيق ، حتى تعرف حقًا ما نتحدث عنه.
لذا أضف الملفات إلى الحل:
  • BddContext.cs
  • Resto.cs
  • Survey.cs
  • User.cs
  • Vote.cs
من دليل الموديلات. لا تنس القيام بتجميع المشروع (compilation).
إذا قمت بإضافة الملفات بوحشية ، فمن الأفضل تغيير مساحة اسم الفئة إلى اسم مشروع DemoScaffold . ولكن بخلاف ذلك ، لا يهم.
للوصول إلى الفئة DbSet ، يجب عليك بالطبع إضافة مرجع NuGet إلى Entity Framework .

سقالات تحكم


بعد ذلك ، سنضيف وحدة تحكم جديدة نسميها Restaurant  ، باستثناء أنه هذه المرة ، لن نقوم بإنشاء وحدة تحكم MVC 5 فارغة ، بل وحدة تحكم ذات طرق عرض ، باستخدام Entity Framework :
ASP.NET framework
إنشاء وحدة تحكم مع طرق العرض ، باستخدام Entity Framework
أطلق عليه اسم مطعم ، ثم حدد الفئة Resto   كفئة نموذجية بالإضافة BddContext   إلى فئة سياق البيانات (إذا لم تظهر الفئات ، فستحتاج إلى إعادة ترجمة طلبك):
ASP.NET framework
اختيار نموذج وفئة سياق البيانات
يمكنك حتى تحديد التخطيط ، الذي لا نحتاج إلى القيام به هنا.
انقر فوق إضافة وسيحدث السحر ...
يولد Visual Studio الكثير من الأشياء لنا. وحدة التحكم RestaurantController   مع عدة إجراءات فيها:
  • Index ، الذي يسرد المطاعم
  • Details ، الذي يعرض تفاصيل المطعم
  • Create   ( GET و POST ) لإنشاء مطعم جديد
  • Edit   ( GET و POST ) لتعديل مطعم موجود
  •   (GET) Delete و DeleteConfirmed   (POST) لحذف مطعم
في الداخل ، نجد كود إطار الكيان(Entity Framework) من نفس النوع الذي أنشأناه في DAL مما يسمح بتنفيذ جميع إجراءات CRUD على أحد المطاعم.
تشير CRUD إلى إنشاء وقراءة وتحديث وحذف (على التوالي إنشاء وقراءة وتحديث وحذف) وهي الإجراءات الأساسية المرتبطة بنموذج البيانات.
هناك أيضا واجهات العرض. أنشأها Visual Studio في الدليل /Views/Restaurant الصحيح (إنشاء ، حذف ، تفاصيل ، تحرير وفهرس).
تشبه هذه المشاهدات تقريبًا تلك التي أنشأناها في تطبيقنا السابق لدينا ، مع وجود اختلاف كبير في اللغة الإنجليزية ، على سبيل المثال:

<h2>Create</h2>
[...]
@Html.ActionLink("Back to List", "Index")
وهذه هي المساعدين(helpers) من هذا النوع DisplayFor   و EditorFor   التي تستخدم بدلا من LabelFor   و TextBoxFor   رأيناها سابقا.
خلاف ذلك ، بصراحة ليست بعيدة عما فعلناه بالفعل. بالطبع ، هناك تعديلات يجب إجراؤها ، على سبيل المثال لإزالة اللغة الإنجليزية ، وتغيير التخطيط قليلاً ، وإزالة (ربما) إمكانية حذف مطعم ، وإضافة عمليات التحقق الشخصية الخاصة بنا ، وما إلى ذلك. ولكن بصرف النظر عن ذلك ، كل شيء موجود. هل رأيت الوقت الذي نوفره في تجنب كل هذا العمل المتكرر وغير المثير للاهتمام؟
كل ما عليك فعله هو استخدام آلية السقالات هذه وسيكون لديك الرفع الثقيل. ستكون وظيفتك فقط لتخصيص ما تم إنشاؤه.

سقالات واجهات العرض


لذلك رأينا كيفية إنشاء ذلك في لمح البصر ، ولكنك لا تحتاج بالضرورة إلى إنشاء وحدة تحكم أو جميع إجراءات CRUD . ربما تحتاج فقط واجهة عرض واحدة أو اثنين؟
حسنًا ، إنه مثالي ، لأنه من الممكن أيضًا اختيار نموذج عرض هيكل مباشرة من النافذة لإضافة عرض:
ASP.NET framework
اختيار نموذج عرض الهيكل
فقط استخدم القائمة المنسدلة. ستدرك الاحتمالات المختلفة المتاحة لنا:
  • Create  : لإنشاء شيء لإنشاء مطعم ؛
  • Delete  : لإنشاء شيء لحذف مطعم ؛
  • Details  :تفاصيل لتوليد ما تشاهد تفاصيل المطعم ؛
  • Edit  :تحرير لإنشاء شيء لتعديل مطعم ؛
  • List  :قائمة لتوليد ما تشاهد قائمة المطاعم.
يستمر العرض الذي يتم إنشاؤه على أساس خصائص الكائنات في النموذج من أجل توفير جميع الحقول التي نحتاجها في العرض.
عملية للغاية لاعادة القليل من العمل وتوفير الوقت.

نماذج أخرى


يعتمد محرك السقالات على قوالب T4 من Visual Studio . من الممكن تعديل القوالب الموجودة. توجد في:
C:\Program Files(x86)\Microsoft Visual Studio 12.0\Common7\IDE\VWDExpress\ItemTemplates\CSharp\Web\MVC4\CodeTemplates\AddView\CSHTML
على سبيل المثال ، يمكننا أن نتخيل استبدال اللغة الإنجليزية بالفرنسية في هذه القوالب. إذا قمت بفتح ملف Create.tt ، يمكنني رؤية الكثير من الأشياء المفهومة. ولكن هناك على وجه الخصوص في مكان واحد:

<div>
    @Html.ActionLink("Back to List", "Index")
</div>
يمكننا تعديله عن طريق:

<div>
    @Html.ActionLink("Retour à la liste", "Index")
</div>
ولماذا لا تفعل الكثير من الأشياء الأخرى ، ولكن لذلك عليك التحدث عن T4 وهذا موضوع آخر ...
هناك نماذج أخرى متنوعة ومتنوعة ، بعضها متوفر على NuGet يمكنك تنزيلها ، يتوافق مع الاحتياجات المختلفة. دعنا نقتبس على سبيل المثال MvcScaffolding التي تحتوي على نماذج تجعل من الممكن إنشاء وحدة تحكم مع مستودع ، بدلاً من استخدام Entity Framework مباشرة في وحدة التحكم. يمكنك تثبيته بالبحث عن MvcScaffolding :
ASP.NET framework
السقالات على Nuget
يحدد قالب تصميم المستودع نموذجًا يسمح بالوصول إلى قاعدة البيانات ، مثل DAL الذي أنشأناه.
كود وحدة التحكم التي تم إنشاؤها كما يلي:

public class RestaurantController : Controller
{
    private readonly IRestoRepository restoRepository;

    // If you are using Dependency Injection, you can delete the following constructor
    public RestaurantController()
        : this(new RestoRepository())
    {
    }

    public RestaurantController(IRestoRepository restoRepository)
    {
        this.restoRepository = restoRepository;
    }

    //
    // GET: /Restaurant/

    public ViewResult Index()
    {
        return View(restoRepository.All);
    }

    //
    // GET: /Restaurant/Details/5

    public ViewResult Details(int id)
    {
        return View(restoRepository.Find(id));
    }

    //
    // GET: /Restaurant/Create

    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Restaurant/Create

    [HttpPost]
    public ActionResult Create(Resto resto)
    {
        if (ModelState.IsValid)
        {
            restoRepository.InsertOrUpdate(resto);
            restoRepository.Save();
            return RedirectToAction("Index");
        }
        else
        {
            return View();
        }
    }

    //
    // GET: /Restaurant/Edit/5

    public ActionResult Edit(int id)
    {
        return View(restoRepository.Find(id));
    }

    //
    // POST: /Restaurant/Edit/5

    [HttpPost]
    public ActionResult Edit(Resto resto)
    {
        if (ModelState.IsValid)
        {
            restoRepository.InsertOrUpdate(resto);
            restoRepository.Save();
            return RedirectToAction("Index");
        }
        else
        {
            return View();
        }
    }

    //
    // GET: /Restaurant/Delete/5

    public ActionResult Delete(int id)
    {
        return View(restoRepository.Find(id));
    }

    //
    // POST: /Restaurant/Delete/5

    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {
        restoRepository.Delete(id);
        restoRepository.Save();

        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            restoRepository.Dispose();
        }
        base.Dispose(disposing);
    }
}
يبدو كثيرًا مثل ما فعلناه ، أليس كذلك؟ 
لاحظ أنه تم إنشاء المستودع وواجهة الواجهة الخاصة به بالطبع في دليل الطرازات ... لاحظ أن طرق العرض مختلفة أيضًا قليلاً وتستخدم طرق العرض الجزئية لعامل كود صغير.

باختصار


  • توفر آلية السقالات وقت مطوري ASP.NET MVC .
  • يقوم بإنشاء جزء كبير من التعليمات البرمجية المتكررة التي نحتاجها لإدارة قوائم العناصر مع عمليات CRUD المختلفة.
  • تعتمد السقالات على محرك قالب T4 وهي قابلة للتوسيع ، يمكنك العثور على نماذج جديدة على الإنترنت.