کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش ASP.Net MVC Core - آموزش اضافه نمودن یک Control به برنامه ASP.Net MVC Core

برای مشاهده سر فصل های مربوط به آموزش MVC Core کلیک نمایید.

آموزش MVC Core - آموزش اضافه نمودن یک Control به برنامه در ASP.NET Core MVC

در این بخش، شما می توانید کلاس هایی برای مدیریت فیلم ها در پایگاه داده اضافه کنید.

این کلاس ها (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

آموزش Asp.net Core

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

آموزش Asp.net Core

ویژوال استودیو وابستگی های (dependencies ) مورد نیاز برای ساخت یک کنترلر را اضافه می کند ، اما کنترلر خود را ایجاد نمی کند.

فراخوانی بعدی AddController در واقغ کنترلر را ایجاد می کند.

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

در پنجره Add Scaffold برروی MVC Controller with views, using Entity Framework کلید کرده و Add را بزنید.

آموزش Asp.net Core

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

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

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

  1. یک Entity Framework Core database context class که در مسیر(Data/MvcMovieContext.cs) قراردارد.
  2. یک کنترلر movies که در مسیر(Controllers/MoviesController.cs) قرار دارد .
  3. یک 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 )به شما اجازه می دهد یک پایگاه داده ای را مطابق با مدل داده های خود بنویسید و هنگامی که مدل داده های شما تغییر می کند، طرح پایگاه داده را به روز کنید.

Add EF tooling and 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 را انتخاب کنید.

آموزش Asp.net Core

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

در 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/_InitialCreate.cs) قرار دارد را اجرا و پایگاه داده را ایجاد میکند.

تست برنامه

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

لینک Create New را زده و اطلاعاتی را وارد کنید.

آموزش Asp.net Core

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

آموزش Asp.net 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

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 را چک کنید :

آموزش Asp.net Core
1396/07/20 6231 1732
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...