آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

ASP.NET Core چیست و به چه دلیل ماکروسافت دست به چنین تغییر عظیمی زد ؟

دوره های مرتبط با این مقاله

ASP.NET Core چیست و به چه دلیل ماکروسافت دست به چنین تغییر عظیمی زد ؟

اگر به تاریخچه ASP.NET نگاه کنیم ، خواهیم دید که عمر این محصول ماکروسافت کم هم نیست . حدود 14 سال است که این محصول سرپاست و در حال سرویس دهی به برنامه نویسان حوزه وب میباشد .از روز شروع و تولید این محصول زمان زیادی گذشته و ماکروسافت روزبه روز سعی در بهبود آن داشته ، ولی آنچه تحت عنوان ASP.NET Core 1.0 به بازار آمده ، یک انقلاب واقعی است .

شاید این فرضیه وجود داشته باشد که ASP.NET Core 1.0 عملن همان ASP.NET 4.6 است دیگر، ولی باید با جرات و جدیت اعلام کرد که "خیر" . ماکروسافت این نسخه را جدی جدی از اول نوشته است . این نسخه شاید قابلیتهای یکسانی با نسخه 4.6 داشته باشد ، ولی واقعن از صفر نوشته شده و به صورت محسوسی سبکتر و ماژولاتر است .

چرا ماکروسافت دست به تغییر زده است؟

ماکروسافت نگران از دست دادن برنامه نویسانش بود . بعد از نابودی Silverlight و عدم توان رقابت با IOS وAndroid ، دیگر چه چیز برای ماکروسافت میماند ؟. در بستر موبایل که برنامه نویسی Windows Mobile با 2 رقیب آن اصلا قابل مقایسه نیست و ماکروسافت شکست را پذیرفته است . تنها جایی که امکان رقابت باNode, Ruby, Python, Java همین بستر وب است و بس. سیستمهای تحت ویندوز یا همان Windows Application ها را که باید مرده بحساب آورد پس تنها صحنه رقابت و جنگ برای ماکروسافت همین بستر وب است . مسئله بعدی Startup ها هستند . آنها به بسترهای Open Source و ارزان نیاز دارند . ماکروسافت با وضعیت قبلی ASP.NET ، اصلن مورد توجه Startup ها قرار نمیگرفت و این بسیار دردناک بود .

حال باید دید چرا این تغییرات میتواند ASP.NET را دوباره به مدار باز گرداند .

  • مجانی و Open Source شدن
  • Cross Platform بودن
  • سادگی در استفاده
  • سبک ، قوی و ساده بودن

با این 4 ویژگی ASP.NET با دیگر محیطها و زبانهای توسعه وب در یک سطح خواهد بود ، مضاف بر اینکه زبان قدرتمند و زیبای C#.NET همچنام هسته اصلی توسعه باقی خواهد ماند و این یعنی یک برتری بسیار بزرگ نسبت به دیگر زبانها !

چه بر سر ASP.NET 4.6 خواهد آمد؟

جواب را کسی نمیداند ، ولی بر اسای مشاهدات ، باید آنرا هم مرده فرض کنید . روی اسب مرده شرط بندی نکنید و Core 1.0 را برنده بدانید .مسلما ورژنهای پایینتر همچنان کار خواهند کرد چنانکه ASP Classic هم هنوز بر روی IIS قابل اجراست ، ولی از لحاظ بازار کار ، پشتیبانی و به روز بودن محصول باید Core 1.0 را به عنوان امید اول این جایگاه حساب نماییم .

آنچه در حال حاضر از دست من و شما بر می آید این است که آرزو کنیم ماکروسافت خسته نشود و دوباره یک محصول نیمه کاره و دارای خطاهای فاحش به بازار عرضه نکند . باید منتظر بود و دید آیا ماکروسافت اینبار محصولی که بتوان به آن افتخار کرد را ارائه میکند یا نه .

ویژگی های ASP.NET Core

  1. cross-platform
  2. high-performance
  3. open-source framework for building modern
  4. cloud-based
  5. Internet-connected applications

چرا از ASP.NET Core استفاده کنیم؟

میلیون ها برنامه نویس از ASP.NET استفاده کرده اند(و هنوز در حال استفاده هستند) برای برنامه های نحت وب.
ASP.NET Core در واقع همان ASP.NET می باشد که دوباره طراحی شده و با تغییرات معماری منجر به modular framework شده است.

مزایای ASP.NET Core

  1. یکپارچه سازی ساخت رابط کاربری و WEB API
  2. یکپارچه سازی client-side frameworks و جریان های توسعه.
    • A unified story for building web UI and web APIs.
    • Integration of modern client-side frameworks and development workflows.
    • A cloud-ready, environment-based configuration system.
    • Built-in dependency injection.
    • A lightweight, high-performance, and modular HTTP request pipeline.
    • Ability to host on IIS or self-host in your own process.
    • Can run on .NET Core, which supports true side-by-side app versioning.
    • Tooling that simplifies modern web development.
    • Ability to build and run on Windows, macOS, and Linux.
    • Open-source and community-focused.

نصب ویژوال استودیو 2017 وNET Core

برای نصب ویژوال استودیو 2017 گزینه های زیر را انخاب می کنیم :

  • ASP.NET and web development (under Web & Cloud)
  • .NET Core cross-platform development (under Other Toolsets)

ایجاد یک برنامه وب

از منو FileNewProject


آموزش MVC Core

بعد از باز شدن کامل پنجره New Project در پنل سمت چپ گزینه Net Core را انتخاب می کنیم

در پنل وسط تب ASP.NET Core Web Application (.NET Core) انتخاب می کنیم
نام پروژه را MvcMovie می گذاریم .


توجه :

حتما نام پروژه را MvcMovie بگذارید تا namespace ها یکسان باشد و در صورت نیاز با کپی کردن کدها پروژه را بتوانید پیش ببرید

بعد از باز شدن پنچره New ASP.NET Core Web Application (.NET Core) - MvcMovie
گزینه Web Application را انتخاب کنید و حالت پیش فرض No Authentication باشد


آموزش MVC Core

ویژوال استودیو از یک قالب پیش فرض برای پروژه های MVC استفاده می کند.
شما با وارد کردن یک نام پروژه و انتخاب چند گزینه یک برنامه کاری واقعی دارید.
با استفاده از کلید F5 یا Ctrl+F5 می توانید پروژه ساخته شده را اجرا کنید.
Ctrl+F5 (non-debug mode)
F5 (debug mode)


آموزش MVC Core

با استفاده از کلید Ctrl+F5 می توانید بدون دیباگ کردن پروژه اجرا کرده و با تغییر در کد ها ،بدون نیاز به اجرا میتوانید با رفرش کردن مروگر تغییرات را ببینید.


آموزش MVC Core

قالب پیش فرض به شما لینک های Home,Contact,About را می دهد

Controller

Model-View-Controller (MVC) الگوی معماری این برنامه را به سه قسمت اصلی تقسیم می کند.

  1. Model
  2. View
  3. Controller

الگوی MVC به ما کمک میکند تا برنامه هایمان را قابل تست تر و راحت تر از برنامه های یکپارچه سنتی به روز کنیم

برنامه های MVC بر پایه ی :

  1. Model :کلاس هایی که داده های(DATA) برنامه را نشان می دهد.مدل کلاس برای تایید قوانینی که برای داده ها (DATA)می گذاریم از منطق اعتبار(validation logic ) استفاده می کنند.به طور معمول آبجکت(objects ) که از مدل(model ) می سازیم حالت مدل(model state ) را در پایگاه داده(database)ذخیره و بازیابی می کند.
    در این آموزش یک مدل فیلم(Movie Model)اطلاعات فیلم را از یک پایگاه داده بازیابی می کند،آن را نمایش می دهد و یا به روز(Update) می کند. زمانی که اطلاعات را به روز می کنیم در پایگاه داده ذخیره می شود.
  2. View: نمایش ها (Views)اجزایی هستند که رابط کاربری برنامه را نمایش می دهند(UI).به طور کلی (UI) داده های مدل(Model Date) را نمایش می دهد.
  3. Controller: در واقع کلاس هایی هستند که درخواست های(requests) مرورگر را انجام می دهند.آن ها داده های مدل را بازیابی می کنند و با فراخوانی قالب های نمایش(view templates)پاسخ مناسب را می دهند.

در یک برنامه MVC نمایش(VIew) ها فقط اطلاعات را نمایش می دهند اما کنترلر(controller ) در تعامل با کاربر می باشد و به ورودی های کاربر واکنش مناسب می دهد

در پنجره Solution Explorer بر روی فولدر Controller راست کلیک کرده و AddNew Item را انتخاب می کنیم


آموزش MVC Core

در پنل سمت چپ گزینه Web را انتخاب کرده و در پنل وسط گزینه MVC Controller Class را انتخاب می کنیم و نامش را HelloWorldController می گذاریم.


آموزش MVC Core

می توانید کدهای زیر را کپی کنید

using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers
{
    public class HelloWorldController : Controller
    {
        // 
        // GET: /HelloWorld/
        public string Index()
        {
         return "This is my default action...";
        }
        // 
        // GET: /HelloWorld/Welcome/ 
        public string Welcome()
        {
            return "This is the Welcome action method...";
        }
    }
}

هر متد (public) در کنترلر (controller ) را می توان به عنوان (HTTP endpoint)خواند.در مثال بالا هر دو متد یک رشته(string) بر می گردانند.HTTP endpoint یک URL قابل جستجو در برنامه وب است مانند: http://localhost:1234/HelloWorld و از پروتکل HTTP استفاده می کند.هر دو متد ما با استفاده از HTTP GET فراخوانی شده اند.

برنامه را با استفاده از Ctrl+F5 (non-debug mode) اجرا می کنیم و در آخر مسیر URL کلمه HelloWorld را اضافه می کنیم.

متد Index یک رشته(string) بر می گرداند.


آموزش MVC Core

MVC کنترلر را فراخوانی می کند(به همراه اکشن مورد نظر ) بسته به نوع ورودی URL .
حالت پیش فرض URL routing logic که توسط MVC استفاده می شود یک فرمت به شکل زیر است:
/[Controller]/[ActionName]/[Parameters]
فرمت Routing شما درون فایل Startup.cs قرار دارد و پیش فرض به شکل زیر است.

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

اولین بخش URL، کلاس کنترل را برای اجرا تعیین می کند.
بنابراین localhost:xxxx/HelloWorld نقشه رسیدن به کلاس HelloWorldController می باشد.
دومین بخش URL، تعیین اکشن(action ) در کلاس کنترل می باشد.
بنابراین localhost:xxxx/HelloWorld/Index باعث می شود اکشن Index از کلاس HelloWorldController اجرا شود.
حال درمرورگر آدرسhttp://localhost:xxxx/HelloWorld/Welcome وارد می کنیم.متد Welcome اجرا می شود و رشته "This is the Welcome action method..." بر می گرداند.
برای این URL کنترلر(HelloWorld) و اکشن (Welcome) می باشد .


آموزش MVC Core

با تغییر کد می توانیم به صورت پارامتر از URL به کنترلر دیتا بفرستیم.
برای مثال /HelloWorld/Welcome?name=Rick&numtimes=4 .
اکشن Welcome را به صورت زیر تغییر می دهیم.

                            // GET: /HelloWorld/Welcome/
                            // Requires using System.Text.Encodings.Web;
                            public string Welcome(string name, int numTimes = 1)
                            {
                            return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
                            }
                        

توجه داشته باشید که برای نشان دادن این ویژگی سی شارپ به طور اختیاری به پارامتر numTimes مقدار پیش فرض دادیم .
از کد HtmlEncoder.Default.Encode استفاده می کنیم برای محافظت برنامه از ورودی های مخرب (یعنی جاوااسکریپت)
برنامه را اجرا کرده و به آدرس زیر می رویم:
http://localhost:xxxx/HelloWorld/Welcome?name=Rick&numtimes=4
به جای XXXX پورت سیستم خود را وارد کنید
می توانید از پارامتر های دیگه ای هم به صورت دلخواه استفاده کنید.
MVC Model Binding به صورت خودکار پارامتر های نام گذاری شده از query string در URL به پارامتر های اکشن خود انتقال می دهد.


آموزش MVC Core

در عکس بالا بخش [Parameters] URL هنوز استفاده نشده.( name) و (numTimes) پارامترها منقل می شوند به query string.
؟(علامت سوال) در آدرس بالا یک جدا کننده می باشد و query string آن را دنبال می کند.
& کاراکتر های query string را جدا می کند.
اکشن Welcome را به صورت زیر تغییر می دهیم.

                            public string Welcome(string name, int ID = 1)
                            {
                            return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
                            }
                        

برنامه را اجرا کرده و به آدرس زیر می رویم:
http://localhost:xxx/HelloWorld/Welcome/3?name=Rick


آموزش MVC Core

این بار از بخش سوم [Parameters] URL تحت عنوان ID استفاده می کنیم.
اکشن (Welcome) شامل یک پارامتر ID است که الگو URL را در MapRoute دنبال می کند.
اگر به دنبال ID علامت سوال(؟) بزاریم به این معنی می شود که پارماتر ID اختیاری است

                            app.UseMvc(routes =>
                            {
                            routes.MapRoute(
                            name: "default",
                            template: "{controller=Home}/{action=Index}/{id?}");
                            });
                        

در این مثال کنترلر در واقع بخشی از "VC" از "MVC" انجام داده است یعنی نمایش (view ) و کنترلر(controller ). کنترلر به طور مستقیم HTML بر می گرداند.به طور کلی شما نمی خواهید که کنترلر HTML بر گرداند زیرا برا نوشتن کد و نگهداری بسیار دشوار می شود.
در عوض ،شما معمولا از فایل قالب (template) جداگانه Razor برای کمک به تولید HTML استفاده می کنید.
شما در آموزش بعدی این کار را انجام می دهید.

آموزش افزودن یک View به برنامه Asp.net MVC Core

در این بخش با تغییر کلاس HelloWorldController برای استفاده از فایل های View تا به بهترین نحوه HTML را بتوانیم encapsulate کنیم.

Razor چیست؟

Razor یک موتور اسکریپت نویسی سریع برای بخش نمایش (View) در ASP.NET MVC می باشد. با استفاده از این موتور به جای استفاده از روش قدیمی اسکریپت نویسی کافی است از علامت @ در ابتدای هر دستور استفاده کنید.

شما یک فایل View با استفاده از Razor ایجاد می کنید.قالب هایی که براساس Razor هستند دارای فرمت فایل .chtml هستند. آنها یک روش ظریف برای ایجاد خروجی HTML با استفاده از C# ارائه می دهند.

در حال حاظر متد یا اکشن Index یک رشته(string)حاوی پیامی بر می گرداند به این معنا که در واقع hard-coded می باشد.
در کلاس HelloWorldController متد Index را به صورت زیر تغییر بدهید.

                            public IActionResult Index()
                            {
                            return View();
                            }
                        

این کد یک Object از View را برمی گرداند.با استفاده از View می توانید HTML تولید کرده و پاسخ مناسب به مرورگر ارسال می نماییم.
کنترلر متد(Controller methods)که همچنین به عنوان( action methods)شناخنه می شوند مانند متد Index در بالا،به طور کلی یک IActionResult (یا کلاس حاصل از ActionResult)را بر می گرداند نه مانند مثال اول یک رشته!
خب برای ایجاد یک View بر روی فولدر View راست کلید کرده و AddNew Item
در پنجره Add New Item – MvcMovie در قسمت Search کلمه View را جستجو کرده و گزینه MVC View Page را انخاب می کنیم و نامش را Index.cshtml. می گذاریم.سپس Add می کنیم.
کد های زیر را وارد می کنیم(Views/HelloWorld/Index.cshtml )

                            @{
                            ViewData["Title"] = "Index";
                            }
                            < h2 >Index< /h2 >
                        < p >Hello from our View Template!< /p >
                        

آدرس http://localhost:xxxx/HelloWorld را وارد کنید.
متد Index در کلاس HelloWorldController کار خاصی نداریم زیرا در واقع این return View(); هست که کار می کند.درواقع این متد مشخص کرد که باید از یک فایل View استفاده کرد تا پاسخ مناسب را به مرورگر بفرستیم.از آنجا که به طور صریح نام View را مشخص نکردیم،MVC به طور پیش فرض از فایل Index.cshtml در مسیر /Views/HelloWorld استفاده می کند.
تصویر زیر رشته "Hello from our View Template!"به صورت hard-coded در نمایش می دهد.


آموزش MVC Core
نکته :

توجه داشته باشید که اگر اندازه مرورگر شما کوچک باشد (برای مثال در موبایل)شما ممکن است نیاز به تغییر وضعیت داشته باشید.در سمت راست بالا برروی Bootstrap navigation button کلیک کرده و می توانید منو را مشاهده کنید.


آموزش MVC Core

تغییر (Views) و (Layout Pages)

برروی لینک هایی که در منو قرار دارد کلیک کنید.متوجه می شوید که هر صفحه از یک Layout مشترک استفاده می کند.فایل layout استفاده شده در قسمت Views/Shared/_Layout.cshtml وجود دارد و فایل _Layout.cshtml را باز می کنیم.
قالب بندی Layout به شما اجازه می دهد چیدمان HTML خود را در یک مکان مشخص کنید و سپس آن را در چند صفحه از سایت خود اعمال کنید.

تغییر عنوان و منوها در فایل Layout

عنوان را به (Movie App) تغییر دهید.
لینک (Home) را به (MvcMovie) و کنترلر (Home) به (Movies) تغییر دهید.
کدهایی که تغییر پیدا کرده در زیر علامت گذاری (highlighted )شده است.

@inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet
< !DOCTYPE html >
< html >
< head >
    < meta charset="utf-8" / >
    < meta name="viewport" content="width=device-width, initial-scale=1.0" / >
    < title >@ViewData["Title"] - Movie App< /title >
    < environment names="Development" >
        < link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" / >
        < link rel="stylesheet" href="~/css/site.css" / >
    < /environment >
    < environment names="Staging,Production" >
        < link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" / >
        < link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" / >
    < /environment >
    @Html.Raw(JavaScriptSnippet.FullScript)
< /head >
< body >
    < nav class="navbar navbar-inverse navbar-fixed-top" >
        < div class="container" >
            < div class="navbar-header" >
                < button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse" >
                    < span class="sr-only" >Toggle navigation< /span >
                    < span class="icon-bar" >< /span >
                    < span class="icon-bar" >< /span >
                    < span class="icon-bar" >< /span >
                < /button >
                < a asp-area="" asp-controller="Movies" asp-action="Index" class="navbar-brand" >MvcMovie< /a >
            < /div >
            < div class="navbar-collapse collapse" >
                < ul class="nav navbar-nav" >
                    

ما هنوز کنترلر (Movies) را ایجاد نکردیم و اگر برنامه را اجرا کنید و برروی لینک کلیک کنید یک خطای 404 دریافت می کنید.
تغییرات خود را ذخیره کنید و روی لینک About کلیک کنیدمتوجه می شوید که About - Movie App به جای About - Mvc Movie آمده است.
برروی لینک Contac کلیک کرده و توجه کنید Movie App را نمایش می دهد.
ما توانستیم با یکبار تغییر در فایل Layout در همه صفحات سایت عنوان و لینک را تغییر دهیم.
بررسی کنید Views/_ViewStart.cshtml file :

@{
    Layout = "_Layout";
}

فایل Views/_ViewStart.cshtml به ارمغان می اورد فایل Views/Shared/_Layout.cshtml برای همه View ها .

تغییر عنوان(title ) برای view (Index)

فایل Views/HelloWorld/Index.cshtml باز می کنیم و دوتغییر ایجاد می کنیم:
متنی که در عنوان مرورگر ظاهر می شود
هدر(header ) ثانوی (< h2 >)
شما آنها را کمی متفاوت می سازید، بنابراین شما می توانید ببینید کدام کد کمی از قسمت برنامه را تغییر می دهد.

@{
    ViewData["Title"] = "Movie List";
}
< h2 >My Movie List< /h2 >
< p >Hello from our View Template!< /p >

ViewData["Title"] = "Movie List"; در کد بالا property (ویژگی) Title متن ViewData را به (Movie List)تنظیم می کند.

< title >@ViewData["Title"] - Movie App< /title >

به صورت زیر هم میتوانید از ویژگی Title به عنوان تگ HTML استفاده کنید.
تغییرات و ذخیره کنید و پروژه را بدون دیباگ کردن اجرا کنید و به آدرس (http://localhost:xxxx/HelloWorld)بروید.
توجه داشته باشید که عنوان مرورگر ، هدر اصلی ، و هدر ثانوی تغییر پیدا کرده است.
عنوان مرورگر با استفاده از ViewData["Title"] ایجاد شده است.
همچنین توجه کنید که محتوا در قالب فایل (Index.cshtml ) با قالب فایل (Views/Shared/_Layout.cshtml) ادغام شده است و یک پاسخ(response ) به HTML به مرورگر فرستاده شده است.


آموزش MVC Core

انتقال Data از Controller به View

اکشن هایی که در کنترلر هستند به ورودی های URL پاسخ می دهند.
یک کلاس کنترلر جایی است که شما کد می نویسید تا درخواست هایی که از مرورگر وارد می شوند را مدیریت کنیم.
کنترلر داده ها (data )را از یک منبع داده(data source) بازیابی می کند و تصمیم می گیرد که چه نوع پاسخی به مرورگر ارسال کند.
View ها می توانند با استفده از یک کنترلر HTML: مناسب را تولید کرده و با فرمت مناسب به مرور گر ارسال کند.
کنترلر مسئول ارائه اطلاعات مورد نیاز برای یک View که View اطلاعات را Render کرده و به مرورگر ارسال کند.
View ها نباید منطق کسب و کار را انجام دهند() یا با پایگاه داده ارتباط برقرارکنند.
یک View باید با داده هایی که توسط کنترلر ارائه می شود،کار کند.
حفظ این جداسازی و اصول کمک می کند که کدهای شما تمیز(clean)،قابل تست(testable) و قابل نگهداری(maintainable) باشد.
در حال حاظر متد Welcome در کلاس HelloWorldController دو پارامتر name و ID را میگیرد سپس مقادیر را مستقیما به مرورگر منتقل می کند.
به جای اینکه کنترلر این پاسخ را به عنوان یک رشته بسازد، اجازه دهید کنترلر را عوض کنیم تا از یک View استفاده کنیم.
View یک پاسخ داینامیک (dynamic response) تولید می کند به این معنی که شما برای ارسال پاسخ به مرورگر باید بیت های مناسب داده را از کنترلر به View منتقل کنید
شما این کار می توانید با داشتن یک کنترلر که دارای داینامیک دیتا هایی(پارامترها) می باشد که View در یک ViewData نیاز دارد فراهم کنید تا View بتواند به آن دسترسی داشته باشد.
به فایل HelloWorldController.cs برگردید و کد هایی مانند کدهای زیر وارد کنید:

using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers
{
    public class HelloWorldController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        public IActionResult Welcome(string name, int numTimes = 1)
        {
            ViewData["Message"] = "Hello " + name;
            ViewData["NumTimes"] = numTimes;
            return View();
        }
    }
}

ViewData تا زمانی که چیزی درون آن قرار ندهید کار خاصی انجام نمی دهد.
ViewData حاوی اطلاعاتی است که به View داده می شود.
یک View برای اکشن Welcome ایجاد کنید و نامش را Welcome.cshtml. بگذارید.
شما یک حلقه در Welcome.cshtml ایجاد میکنید که نشان می دهد (Hello) چند بار تکرار شده است.
کد های زیر را وارد کنید:

@{
ViewData["Title"] = "Welcome";
}
< h2 >Welcome< /h2 >
< ul >
    @for (int i = 0; i <  (int)ViewData["NumTimes"]; i++)
    {
    < li >@ViewData["Message"]< /li >
    }
< /ul >
                        

تغییرات را ذخیره کنید و به آدرس زیر بروید:
http://localhost:xxxx/HelloWorld/Welcome?name=Rick&numtimes=4
داده از URL گرفته شده و با استفاده از MVC Model Binder به کنترلر منتقل می شوند.
کنترلر داده ها را به صورت (packages ) به ViewData وارد می کند و آبجکت ساخته شده را به View می فرستد و View داده ها را به عنوان HTML به مرورگر ارائه میکند.


آموزش MVC Core

در این مثال با استفاده از ViewData اطلاعاتی را از کنترلر به View فرستادیم.در بخش های بعدی آموزش با استفاده از View Model داده ها را از کنترلر به View انتقال می دهیم


افزودن یک مدل (Model) به برنامه ASP.net MVC Core

در این بخش، شما می توانید کلاس هایی برای مدیریت فیلم ها در پایگاه داده اضافه کنید.
این کلاس ها (Model) خواهد بود و درواقع بخش(MVC).
شما از این کلاس ها با (EF Core)برای کار با پایگاه داده استفاده می کنید.
EF Core درواقع یک ORM (object-relational mapping) می باشد که کد دسترسی داده (data access) را ساده می کند که باید نوشت.
کلاس های مدل(model ) به عنوان کلاس های POCO (plain-old CLR objects) شناخته می شوند زیرا آنها هیچ وابستگی به EF Core ندارند.
آنها فقط خواص(properties) داده هایی را که در پایگاه داده ذخیره می شوند تعریف می کنند.
در این آموزش شما ابتدا کلاس های مدل را می نویسید و سپس EF Core پایگاه داده را ایجاد می کند.

اضافه کردن یک کلاس مدل

در قسمت راست برنامه در پنجره Solution Explorer بر روی MvcMovie راست کلید کرده و به ترتیب
AddNew Folder و اسم فولدر را Models می گذاریم.

توجه :

در ASP.NET Core 2.0 فولدر Models معمولا وجود دارد و نیاز به ساخت آن نیست.

بر روی فولدر Models راست کلید کرده و AddClass را انتخاب کرده و نام کلاس را Movie میگذاریم و کدهای زیر را وارد می کنیم.

using System;
namespace MvcMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

فیلد ID توسط پایگاه داده برای primary key مورد نیاز است.
پروژه را یکبار Build کنید تا مطمئن شوید Error ندارید.
حالا شما یک Model در برنامه MVC هستید.


Scaffolding a controller

در قسمت راست برنامه در پنجره Solution Explorer بر روی Controllers راست کلید کرده و به ترتیب
AddController


آموزش MVC Core

در پنجره Add MVC Dependencies بر روی Minimal Dependencies کلید و گزینه Add را بزنید.


آموزش MVC Core

ویژوال استودیو وابستگی های (dependencies ) مورد نیاز برای ساخت یک کنترلر را اضافه می کند ، اما کنترلر خود را ایجاد نمی کند.
فراخوانی بعدی AddController در واقغ کنترلر را ایجاد می کند.
در قسمت راست برنامه در پنجره Solution Explorer بر روی Controllers راست کلید کرده و به ترتیب
AddController
در پنجره Add Scaffold برروی MVC Controller with views, using Entity Framework کلید کرده و Add را بزنید.


آموزش MVC Core

تکمیل کردن پنجره Add Controller

  • Model class: Movie (MvcMovie.Models)
  • Data context class: Select the + icon and add the default MvcMovie.Models.MvcMovieContext
    آموزش MVC Core
  • Views: Keep the default of each option checked
  • Controller name: Keep the default MoviesController
  • Tap Add
    آموزش MVC Core

ویژوال استودیو موارد زیر را ایجاد می کند:

  • یک Entity Framework Core database context class که در مسیر(Data/MvcMovieContext.cs) قراردارد.
  • یک کنترلر movies که در مسیر(Controllers/MoviesController.cs) قرار دارد .
  • یک Razor view files for Create, Delete, Details, Edit and Index pages که در مسیر(Views/Movies/*.cshtml) قرار دارد.

database context به صورت اتوماتیک ایجاد شده و CRUD(create, read, update, and delete) اکشن ها و متدها و View ها ایجاد شده و شناخته شده اند.
شما به زودی یک برنامه وب کاملا کاربردی دارید که به شما امکان مدیریت یک پایگاه داده فیلم را می دهد.
اگر شما برنامه رو اجرا کنید و برروی لینک Mvc Movie کلید کنید با خطا مواجه می شوید.

An unhandled exception occurred while processing the request.
SqlException: Cannot open database "MvcMovieContext-< GUID removed >" requested by the login. The login failed.
Login failed for user 'Rick'.
System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString

شما باید پایگاه داده را ایجاد کرده و شما از ویژگی EF Core Migrations برای انجام این کار استفاده می کنید.
مهاجرت (Migrations )به شما اجازه می دهد یک پایگاه داده ای را مطابق با مدل داده های خود بنویسید و هنگامی که مدل داده های شما تغییر می کند، طرح پایگاه داده را به روز کنید.

افزودن ابزار EF و Perform Initial Migration

در این بخش شما از Package Manager Console (PMC) استفاده می کنید:

  • اضافه کردن Entity Framework Core Tools package : این package برای افزودن migrations و به روز رسانی پایگاه داده مورد نیاز است.
  • اضافه کردن initial migration
  • به روز رسانی پایگاه داده با initial migration

از منو تب Tools را انتخاب کرده و مسیر NuGet Package Manager Package Manager Console را انتخاب کنید.


آموزش MVC Core

در PMC دستورات زیر را دنبال کنید:

Install-Package Microsoft.EntityFrameworkCore.Tools
Add-Migration Initial
Update-Database

دستور Add-Migration کدهایی ایجاد می کند برای طرح اولیه دیتابیس.این طرح بر اساس مدل مشخص شده در DbContext که در مسیر(Data/MvcMovieContext.cs file) قرار دارد ایجاد شده است.Initial استدلالی است که برای migrations استفاده می شود. شما می توانید هر نامی را استفاده کنید، اما با توافق، نامی را انتخاب کنید که migrationرا توصیف می کند.
دستور Update-Database متد UP را که در فایل (Migrations/< time-stamp >_InitialCreate.cs) قرار دارد را اجرا و پایگاه داده را ایجاد میکند.

تست برنامه

برنامه را اجرا کرده و بر لینک Mvc Movie کلید کنید.

برنامه را اجرا کرده و بر لینک Mvc Movie کلید کنید.
لینک Create New را زده و اطلاعاتی را وارد کنید.


آموزش MVC Core

با ضربه زدن Create فرم به سرور پست(posted ) می شود، جایی که اطلاعات فیلم در یک پایگاه داده ذخیره می شود.برنامه به /Movies URL هدایت می شود جایی که اطلاعات فیلم جدید ایجاد شده نمایش داده می شود.


آموزش MVC Core

چندین اطلاعات دیگر وارد کنید و با لینک های Edit, Details, Delete کار کنید.

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();
    services.AddDbContext< MvcMovieContext >(options =>
            options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}

کد بالا که هایلایت شده است نشان میدهد که movie database context اضافه شده است به Dependency Injection container

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;
    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }

Constructor از Dependency Injection استفاده می کند تاdatabase context (MvcMovieContext) را به controller تزریق کند.

database context هر یک از متد های CRUD در کنترلر را استفاده می کند.

Strongly typed models and the @model keyword

پیش از این در این آموزش ، شما دیدید که یک کنترلر دیتا یا آبجکتی را به یک View با استفاده از ViewData عبور می دهد و استفاده کند. ViewData درواقع یک آبجکت داینامیکی هست که یک راه مناسب برای انتقال اطلاعات به یک viewرا فراهم می کند.
MVC همچنین توانایی انتقال strongly typed model objects را به یک viewرا فراهم می کند. این رویکرد strongly typed را قادر می سازد تا بهتر از compile-time کد خود استفاده کنید. scaffolding با استفاده از این روش (یعنی انتقال یک strongly typed model) با MoviesController کلاس و views هایی که methods و views را ایجاد می کند استفاده شده است.
تولید متد Details در فایل Controllers/MoviesController.cs را بررسی می کنیم:

// GET: Movies/Details/5
public async Task< IActionResult > Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var movie = await _context.Movie
        .SingleOrDefaultAsync(m => m.ID == id);
    if (movie == null)
    {
        return NotFound();
    }
    return View(movie);
}

پارامتر id به طور کلی به عنوان route data منتقل می شود. مثلا:

http://localhost:5000/movies/details/1 که مجموعه:

  • کنترلر movies(بخش اول URL)
  • اکشن details(بخش دوم URL)
  • ID که در این جا 1 هست(بخش آخر URL)

شما همچنین می توانید ID را به صورت query string منتقل کنید:

http://localhost:1234/movies/details?id=1

یک عبارت لامبدا به SingleOrDefaultAsync منتقل می شود تا movie entities را انتخاب کند که مطابق با route data یا مقدار query string باشد.

var movie = await _context.Movie
    .SingleOrDefaultAsync(m => m.ID == id);

اگر یک فیلم پیدا شود، یک نمونه از مدل فیلم به نمای(View) Details منتقل می شود.

return View(movie);

بررسی کنید محتوای فایل Views/Movies/Details.cshtml:

@model MvcMovie.Models.Movie
@{
    ViewData["Title"] = "Details";
}
< h2 >Details< /h2 >
< div >
< h4 >Movie< /h4 >
< hr / >
    < dl class="dl-horizontal" >
    < dt >
            @Html.DisplayNameFor(model = > model.Title)
        < /dt >
        < dd >
            @Html.DisplayFor(model = > model.Title)
        < /dd >
        < dt >
            @Html.DisplayNameFor(model = > model.ReleaseDate)
        < /dt >
        < dd >
            @Html.DisplayFor(model = > model.ReleaseDate)
        < /dd >
        < dt >
            @Html.DisplayNameFor(model = > model.Genre)
        < /dt >
        < dd >
            @Html.DisplayFor(model = > model.Genre)
        < /dd >
        < dt >
            @Html.DisplayNameFor(model = > model.Price)
        < /dt >
        < dd >
            @Html.DisplayFor(model = > model.Price)
        < /dd >
    < /dl >
< /div >
< div >
< a asp-action="Edit" asp-route-id="@Model.ID" >Edit< /a > |
< a asp-action="Index" >Back to List< /a >
< /div >

با قرار دادن عبارت @model در بالای فایل View می توانید نوع Object که View از آن استفاده کند را تعیین کنید.
هنگامی که شما کنترلر Movie را ایجاد کردید ، ویژوال استودیو به طور خودکار عبارت @model را در بالای فایل Details.cshtml قرار میدهد.

@model MvcMovie.Models.Movie

این دستورالعمل @model به شما اجازه می دهد تا به Movie دسترسی داشته باشید که کنترلر با استفاده از یک Strongly typed models به View نمایش داده می شود.
برای مثال در Details.chtml ، کد هر Movie را به DisplayNameFor و DisplayFor (که در واقع HTML Helpers می باشند) با استفاده از Strongly typed models انتقال میدهد .
اکشن های Create و Edit و نمایه هایشان(Views) هم یک شیء(Object) مدل فیلم (Movie model)را منتقل می کنند.
بررسی کنید Index.cshtml و اکشن Index در Movies controller. توجه کنید که کد چگونه یک شی List را هنگامی که متد View را فراخوانی می کند ایجاد می کند.
کد این لیست Movies را از متد Action Index به view پاس می دهد:

// GET: Movies
public async Task< IActionResult > Index()
{
    return View(await _context.Movie.ToListAsync());
}

هنگامی که شما کنترلر movies را ایجاد کردید، scaffolding به صورت اتوماتیک عبارت زیر@model را در بالای فایل Index.cshtml قرار داد:

@model IEnumerable< MvcMovie.Models.Movie >

دستورالعمل @model به شما اجازه می دهد تا به لیستی از فیلم ها که کنترلر به view با استفاده از یک شی Strongly typed models منتقل شده است دسترسی پیدا کنید.

                            the code loops through the movies with a foreach statement over the strongly typed Model object:
                        
@model IEnumerable< MvcMovie.Models.Movie > @{ ViewData["Title"] = "Index"; } < h2 >Index< /h2 > < p > < a asp-action="Create" >Create New< /a > < /p > < table class="table" > < thead > < tr > < th > @Html.DisplayNameFor(model = > model.Title) < /th > < th > @Html.DisplayNameFor(model = > model.ReleaseDate) < /th > < th > @Html.DisplayNameFor(model = > model.Genre) < /th > < th > @Html.DisplayNameFor(model = > model.Price) < /th > < th >< /th > < /tr > < /thead > < tbody > @foreach (var item in Model) { < tr > < td > @Html.DisplayFor(modelItem = > item.Title) < /td > < td > @Html.DisplayFor(modelItem = > item.ReleaseDate) < /td > < td > @Html.DisplayFor(modelItem = > item.Genre) < /td > < td > @Html.DisplayFor(modelItem = > item.Price) < /td > < td > < a asp-action="Edit" asp-route-id="@item.ID" >Edit< /a > | < a asp-action="Details" asp-route-id="@item.ID" >Details< /a > | < a asp-action="Delete" asp-route-id="@item.ID" >Delete< /a > < /td > < /tr > } < /tbody > < /table >

از آنجا که Object model از نوع strongly typed (به عنوان شیء IEnumerable< Movie >) هر آیتم در loop به عنوان Movie تایپ می شود. در میان مزایای دیگر، این بدان معنی است که شما می توانید compile-time را چک کنید :


آموزش MVC Core

آموزش کار با دیتابیس محلی SQL Local

MvcMovieContext آبجکتی است که وظیفه اتصال به پایگاه داده و نقشه سازی اشیاء فیلم به سوابق پایگاه داده را مدیریت می کند. database contextبا Dependency Injection container در متد ConfigureServices در فایل Startup.cs ثبت می شود:

public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); services.AddDbContext< MvcMovieContext > (options => options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext"))); }

سیستم پیکربندی Asp.Net Core میتواند Connection string را بخواند.برای توسعه رشته اتصال(Connection string) از فایل appsettings.json گرفته میشود.

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}

هنگامی که برنامه را به یک سرور تست یا تولید اعمال می کنید، می توانید یک متغیر محیطی یا یک رویکرد دیگر برای تنظیم رشته اتصال(Connection string) به یک SQL Server واقعی استفاده کنید.

SQL Server Express LocalDB

LocalDB یک نسخه سبک SQL Server Express Database Engine است که برای توسعه برنامه هدف قرار می گیرد.
LocalDB شروع به درخواست و در حالت کاربر اجرا می شود، بنابراین هیچ پیکر بندی پیچیده ای وجود ندارد.به طور پیش فرض ،پایگاه داده محلی(LocalDB) فایل های .mdf را در دایرکتوری CUsers/< user > ایجاد می کند.
از منو View گزینه SQL Server Object Explorer انتخاب کنید:


آموزش MVC Core

برروی جدول Movie راست کلید کرده و گزینه View Designer انتخاب کنید:


آموزش MVC Core

آموزش MVC Core

به علامت کلید در کنار فیلد ID دقت کنید.به طور پیش فرض EF یک مشخصه(property ) با نام ID که primary key می باشد ایجاد می کند.
بر روی جدول Movie راست کلید کرده و گزینه View Data را انتخاب کنید:


آموزش MVC Core

آموزش MVC Core

Seed the database

یک کلاس جدید به نام SeedData در فولدر Models ایجاد کنید.کد های زیر را کپی کنید :

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
namespace MvcMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new MvcMovieContext(
serviceProvider.GetRequiredService< DbContextOptions< MvcMovieContext > >()))
{
// Look for any movies.
if (context.Movie.Any())
{
    return;   // DB has been seeded
}
context.Movie.AddRange(
     new Movie
     {
         Title = "When Harry Met Sally",
         ReleaseDate = DateTime.Parse("1989-1-11"),
         Genre = "Romantic Comedy",
         Price = 7.99M
     },
     new Movie
     {
         Title = "Ghostbusters ",
         ReleaseDate = DateTime.Parse("1984-3-13"),
         Genre = "Comedy",
         Price = 8.99M
     },
     new Movie
     {
         Title = "Ghostbusters 2",
         ReleaseDate = DateTime.Parse("1986-2-23"),
         Genre = "Comedy",
         Price = 9.99M
     },
   new Movie
   {
       Title = "Rio Bravo",
       ReleaseDate = DateTime.Parse("1959-4-15"),
       Genre = "Western",
       Price = 3.99M
   }
);
context.SaveChanges();            }        }    }}
                        

اگر هر فیلمی در DB وجو داشت ، مقداردهی اولیه نمی شود و هیچ فیلمی اضافه نمی شود.

if (context.Movie.Any())
{
    return;   // DB has been seeded.
}

Add the seed initializer

در فایل Startup.cs در انتهای متد Configure کد seed initializer اضافه می کنیم:

app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
SeedData.Initialize(app.ApplicationServices);
}
}
}
                        

برنامه را تست کنید:

  • تمام پرونده ها را در DB حذف کنید. شما می توانید این کار را با لینک های Delete در مرورگر یا از SSOX انجام دهید.
  • برنامه را برای راه اندازي کردن مجبور کنید (با متدهای کلاس Startup تماس بگیرید)، بنابراین متد seed اجرا می شود. برای اعمال زودهنگام، IIS Express باید متوقف شود و مجددا راه اندازی شود. شما می توانید این کار را با هر یک از روش های زیر انجام دهید:
    • اگر برنامه در حالت non-debug mode کلید F5 را بزنید.
    • اگربرنامه در حالت debug mode می باشد ابتدا برنامه را متوقف کنید و سپس کلید F5 را بزنید.

برنامه داده های Seed شده را نشان میدهد:


آموزش MVC Core

Controller methods and views

ما شروع خوبی با این برنامه داشتیم ولی هنوز تا ایده آل شدن این اپلیکیشن فاصله داریم.ما نمی خواهیم زمان(12:00:00 AM در عکس زیر)را ببینیم و تاریخ انتشار باید دوکلمه باشد.


آموزش MVC Core

فایل Models/Movie.cs را باز کنید و کدهای زیر را که هایلایت شده است را وارد کنید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MvcMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}
                        
نکته :

حتما فضای نام using System.ComponentModel.DataAnnotations; اضافه کنید.

ویژگی (attribute) Display نشان می دهد چه چیزی برای نمایش یک فیلد نمایش داده می شود. در این جا(Release Date) به جای (ReleaseDate) نمایش داده می شود.
ویژگی DataType نوع داده (Date) را مشخص می کند، بنابراین اطلاعات زمان ذخیره شده در فیلد نمایش داده نمی شود.
از طریق مرورگر به کنترلر Movie رفته و نشانگر ماوس را بر روی لینک Edit قرار دهید :


آموزش MVC Core

لینک های Edit,Delete,Details توسط MVC Core Anchor Tag Helper در فایل Views/Movies/Index.cshtml ایجاد شده است.

< a asp-action="Edit" asp-route-id="@item.ID" >Edit< /a > |
< a asp-action="Details" asp-route-id="@item.ID" >Details< /a > |
< a asp-action="Delete" asp-route-id="@item.ID" >Delete< /a >
< /td >
< /tr >
                        

Tag Helpers کد سرور را فعال می کنند تا در ایجاد و ارائه عناصر HTML در فایل های Razor مشارکت کنند. در کد بالا، AnchorTagHelper به صورت پویا مقدار صفت HTML href را از اکشن controller و شناسه مسیر(route id) تولید می کند. شما از مرورگر مورد علاقه خود از View Source استفاده می کنید یا از ابزار توسعه دهنده برای بررسی نشانه گذاری(markup) تولید استفاده کنید. بخشی از HTML تولید شده در زیر نشان داده شده است:

< td >
    < a href="/Movies/Edit/4" > Edit < /a > |
    < a href="/Movies/Details/4" > Details < /a > |
    < a href="/Movies/Delete/4" > Delete < /a >
< /td >
                        

فرمت مسیریابی(routing) در فایل Startup.cs به یاد بیاورید :

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

ASP.NET Core تبدیل می کند http://localhost:1234/Movies/Edit/4 به در خواستی برای اکشن Edit در کنترلر Movie با پرامتر (ID) 4.
کنترلر Movie را باز کنید و دو اکشن Edit را بررسی کنید :
متد HTTP GET Edit نشان می دهد کدام فیلم را برگزیند و فرم ویرایش را تولید کند با استفاده از فایل Edit.cshtml Razor.

// GET: Movies/Edit/5
public async Task< IActionResult > Edit(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id);
    if (movie == null)
    {
        return NotFound();
    }
    return View(movie);
}

کد زیر، متد HTTP POST Edit را نشان می دهد که فیلم ارسال شده را پردازش می کند:

/ POST: Movies/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task< IActionResult > Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
    if (id != movie.ID)
    {
        return NotFound();
    }
    if (ModelState.IsValid)
    {
        try
        {
            _context.Update(movie);
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!MovieExists(movie.ID))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }
        return RedirectToAction("Index");
    }
    return View(movie);
}

ویژگی [Bind] یک راه برای حفاظت در برابر حملات over-posting می باشد.شما فقط می توانید مشخصه هایی() که در [Bind] وارد کردین را تغییر دهید.
توجه کنید که در اکشن دوم Edit ابتدا متد [HttpPost] آورده شده است.
ویژگی HttpPost مشخص می کند که این اکشن Edit را می توان فقط برای درخواست های POST فراخوانی کرد.
شما می توانید برای اولین اکشن Edit متد [HttpGet] را فراخوانی کنید ولی این کار لازم نیس زیرا به طور پیش فرض [HttpGet] اعمال می شود.
ویژگی ValidateAntiForgeryToken برای جلوگیری از تقلب یک درخواست استفاده می شود و با یک علامت ضد جعل تولید شده در فایل (Views / Movies / Edit.cshtml) ایجاد شده است و میتوانید مشاهده کنید.
فایل view برای اکشن Edit هم anti-forgery token با استفاده Tag Helper از اعمال شده است.

< form asp-action="Edit" >

Form Tag Helperیک علامت مخفی ضد جعل را تولید می کند که باید با شناسه ضد جعل تولید شده توسط [ValidateAntiForgeryToken]مطابقت داشته باشد در اکشن Editکنترلر Movies .
متد HttpGet ویرایش(Edit)، پارامتر ID فیلم را می گیرد، فیلم را با استفاده از روش Entity Framework SingleOrDefaultAsync به نمایش می گذارد، و فیلم انتخاب شده را به Edit View باز می گرداند. اگر یک فیلم پیدا نشد، NotFound (HTTP 404) بازگردانده می شود.

// GET: Movies/Edit/5
public async Task< IActionResult > Edit(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id);
    if (movie == null)
    {
        return NotFound();
    }
    return View(movie);
}
نکته :

Scaffolding یک چارچوب برای تولید خودکار کد در ASP.Net است. با استفاده ازمدل Entity برای عملیات چهارگانه CRUD کدها را به صورت خودکار می سازد.

هنگامی که سیستم Scaffolding را برای Edit View ایجاد کرد کلاس Movie را مورد بررسی قرار داد و کد ایجاد کرد تا عناصر < label > و < input > را برای هر ویژگی کلاس به نمایش در آورند.
مثال زیر نشان میدهد Edit view توسط سیستم Visual Studio scaffolding تولید شده است :

@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Edit";
}
< h2 >Edit< /h2 >
< form asp-action="Edit" >
    < div class="form-horizontal" >
        < h4 >Movie< /h4 >
        < hr / >
        < div asp-validation-summary="ModelOnly" class="text-danger" >< /div >
        < input type="hidden" asp-for="ID" / >
        < div class="form-group" >
            < label asp-for="Title" class="col-md-2 control-label" >< /label >
            < div class="col-md-10" >
                < input asp-for="Title" class="form-control" / >
                < span asp-validation-for="Title" class="text-danger" >< /span >
            < /div >
        < /div >
        < div class="form-group" >
            < label asp-for="ReleaseDate" class="col-md-2 control-label" >< /label >
            < div class="col-md-10" >
                < input asp-for="ReleaseDate" class="form-control" / >
                < span asp-validation-for="ReleaseDate" class="text-danger" >< /span >
            < /div >
        < /div >
        < div class="form-group" >
            < label asp-for="Genre" class="col-md-2 control-label" >< /label >
            < div class="col-md-10" >
                < input asp-for="Genre" class="form-control" / >
                < span asp-validation-for="Genre" class="text-danger" >< /span >
            < /div >
        < /div >
        < div class="form-group" >
            < label asp-for="Price" class="col-md-2 control-label" >< /label >
            < div class="col-md-10" >
                < input asp-for="Price" class="form-control" / >
                < span asp-validation-for="Price" class="text-danger" >< /span >
            < /div >
        < /div >
        < div class="form-group" >
            < div class="col-md-offset-2 col-md-10" >
                < input type="submit" value="Save" class="btn btn-default" / >
            < /div >
        < /div >
    < /div >
< /form >

< div >
    < a asp-action="Index" >Back to List< /a >
< /div >

@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
                        

توجه کنید که قالب View دارای یک دستورmodel MvcMovie.Models.Movie در بالای فایل است. مشخص می کند که این view انتظار دارد که مدلی برای قالب view از نوع Movie باشد.
کد scaffolded از چندین متد Tag Helper جهت ساده سازی نشانه گذاری(markup) HTML استفاده می کند.
Label Tag Helper در واقع (Title,ReleaseDate,Genre, Price) نمایش می دهد.
Input Tag Helper در واقع یک تگ Html < input > را ارائه می دهد.
Validation Tag Helper هر پیام تاییدیه مربوط به آن property را نمایش می دهد.
اپلیگیشن را اجرا کرده و به آدرس /Movies بروید.برروی لینک Edit کلید کنید.در مرورگر Source page را ملاحضه کنید.HTML تولید شده برای عنصر < Form >در زیر نشان داده شده است.

< form action="/Movies/Edit/7" method="post" >
    < div class="form-horizontal" >
        < h4 >Movie< /h4 >
        < hr / >
        < div class="text-danger" / >
        < input type="hidden" data-val="true" data-val-required="The ID field is required." id="ID" name="ID" value="7" / >
        < div class="form-group" >
            < label class="control-label col-md-2" for="Genre" / >
            < div class="col-md-10" >
                < input class="form-control" type="text" id="Genre" name="Genre" value="Western" / >
                < span class="text-danger field-validation-valid" data-valmsg-for="Genre" data-valmsg-replace="true" >< /span >
            < /div >
        < /div >
        < div class="form-group" >
            < label class="control-label col-md-2" for="Price" / >
            < div class="col-md-10" >
                < input class="form-control" type="text" data-val="true" data-val-number="The field Price must be a number." data-val-required="The Price field is required." id="Price" name="Price" value="3.99" / >
                < span class="text-danger field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true" >< /span >
            < /div >
        < /div >
        < !-- Markup removed for brevity -- >
        < div class="form-group" >
            < div class="col-md-offset-2 col-md-10" >
                < input type="submit" value="Save" class="btn btn-default" / >
            < /div >
        < /div >
    < /div >
    < input name="__RequestVerificationToken" type="hidden" value="CfDJ8Inyxgp63fRFqUePGvuI5jGZsloJu1L7X9le1gy7NCIlSduCRx9jDQClrV9pOTTmqUyXnJBXhmrjcUVDJyDUMm7-MF_9rK8aAZdRdlOri7FmKVkRe_2v5LIHGKFcTjPrWPYnc9AdSbomkiOSaTEg7RU" / >
< /form >
                        

عناصر < input > در یک عنصر HTML < form > هستند که ویژگی عمل آن برای ارسال به / Movies / Edit / id URL تنظیم شده است. هنگامی که دکمه ذخیره(Save) کلیک می شود، داده های فرم به سرور ارسال می شود. آخرین خط قبل از عنصر < / form > علامت مخفی XSRF را نشان می دهد که توسط Tag Helper ایجاد شده است.

Processing the POST Request

لیست زیر نشان میدهد یک نسخه [HttpPost] از اکشن Edit :

// POST: Movies/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task< IActionResult > Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
    if (id != movie.ID)
    {
        return NotFound();
    }
    if (ModelState.IsValid)
    {
        try
        {
            _context.Update(movie);
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!MovieExists(movie.ID))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }
        return RedirectToAction("Index");
    }
    return View(movie);
}

ویژگی [ValidateAntiForgeryToken] نشانگر مخفی XSRF تولید شده توسط ژنراتور جعلی ضد جعل را در Helper Form Tag تایید می کند.
سیستم model Binding، مقادیر فرم ارسال شده را می گیرد و یک شیء فیلم را به عنوان پارامتر فیلم منتقل می کند متد ModelState.IsValid تایید می کند که داده های ارائه شده در فرم را می توان برای تغییر (ویرایش یا به روز رسانی) یک شیء فیلم مورد استفاده قرار داد. اگر داده معتبر باشد ذخیره می شود. داده های فیلم به روز شده (ویرایش شده) با فراخوانی روش SaveChangesAsync از پایگاه داده ذخیره می شود. پس از ذخیره داده ها، کد کاربر را به روش Action Index از MovieController کلاس هدایت می کند، که مجموعه فیلم را نمایش می دهد، از جمله تغییرات انجام شده.
قبل از اینکه فرم به سرور ارسال شود، اعتبارسنجی سمت سرویس گیرنده، هر یک از قوانین اعتبارسنجی در زمینه را بررسی می کند. اگر خطاهای اعتبار سنجی وجود دارد، یک پیام خطا نمایش داده می شود و فرم ارسال نشده است. اگر جاوا اسکریپت غیرفعال باشد، شما اعتبارسنجی سمت سرویس گیرنده را نخواهید داشت اما سرور مقادیر ارسال شده معتبر را تشخیص می دهد و مقادیر فرم با پیام های خطا نمایش داده می شوند. Validation Tag Helper در قالب Views/Movies/Edit.cshtml خطاهای مناسب را نمایش می دهد.


آموزش MVC Core

تمام روش های HttpGet در کنترلر movie یک الگوی مشابه را دنبال می کند. آنها یک شیء فیلم (یا لیستی از اشیاء را در مورد(Index)دریافت می کنند و شی (model) را به نمای منتقل می کنند.اکشن Create یک شیء خالی movie را به Create View منتقل می کند.تمام متد های Create,Edit,Delete,… یا در کل متدهایی که باعث تغییر دیتا می شود را با متد [HttpPost] بارگذاری کنید. تغییر داده ها با متد HTTP GET یک خطر امنیتی است. تغییر داده ها با متد HTTP GET همچنین بهترین روش HTTP و معماری REST را نقض می کند، که مشخص می کند که درخواست های GET نباید وضعیت برنامه شما را تغییر دهد. به عبارت دیگر انجام یک عملیات GET باید یک عملیات ایمن باشد که هیچ عارضه ای ندارد و اطلاعات پایدار شما را تغییر نمی دهد.

  • 1457
  •    384
  • تاریخ ارسال :   1397/03/01

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .