دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه! دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه!
🎯 ثبت نام
بستن تبلیغات
تسلط کامل بر سی‌شارپ با یک دوره پروژه‌محور

یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شی‌گرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفه‌ای و امکانات کامل!

مشاهده بیشتر
تسلط جامع بر MVC Core برای توسعه وب حرفه‌ای

یادگیری MVC Core از مبانی تا پیشرفته: شی‌گرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژه‌های کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!

مشاهده بیشتر

آموزش ASP.Net MVC Core - آموزش متدهای Control و Viewها در ASP.Net MVC Core

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

آموزش MVC Coreآموزش متدهای Controler و View ها

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

آموزش Asp.net Core

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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; }
    }
}
<button></button>

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

ویژگی (attribute) Display نشان می دهد چه چیزی برای نمایش یک فیلد نمایش داده می شود. در این جا(Release Date) به جای (ReleaseDate) نمایش داده می شود.

ویژگی DataType نوع داده (Date) را مشخص می کند، بنابراین اطلاعات زمان ذخیره شده در فیلد نمایش داده نمی شود.

از طریق مرورگر به کنترلر Movie رفته و نشانگر ماوس را بر روی لینک Edit قرار دهید :

آموزش Asp.net Core

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

1
2
3
4
5
6
<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>
     
 
<button></button>
>

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

1
2
3
4
5
                            <a href="/Movies/Edit/4"> Edit </a> |
                            <a href="/Movies/Details/4"> Details </a> |
                            <a href="/Movies/Delete/4"> Delete </a>
 
<button></button>

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

1
2
3
4
5
6
7
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});
<button></button>

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

کنترلر Movie را باز کنید و دو اکشن Edit را بررسی کنید :

متد HTTP GET Edit نشان می دهد کدام فیلم را برگزیند و فرم ویرایش را تولید کند با استفاده از فایل Edit.cshtml Razor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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);
}
<button></button>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/ POST: Movies/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
[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);
}
<button></button>

ویژگی [Bind] یک راه برای حفاظت در برابر حملات over-posting می باشد.شما فقط می توانید مشخصه هایی() که در [Bind] وارد کردین را تغییر دهید.

توجه کنید که در اکشن دوم Edit ابتدا متد [HttpPost] آورده شده است.

ویژگی HttpPost مشخص می کند که این اکشن Edit را می توان فقط برای درخواست های POST فراخوانی کرد.

شما می توانید برای اولین اکشن Edit متد [HttpGet] را فراخوانی کنید ولی این کار لازم نیس زیرا به طور پیش فرض [HttpGet] اعمال می شود.

ویژگی ValidateAntiForgeryToken برای جلوگیری از تقلب یک درخواست استفاده می شود و با یک علامت ضد جعل تولید شده در فایل (Views / Movies / Edit.cshtml) ایجاد شده است و میتوانید مشاهده کنید.

فایل view برای اکشن Edit هم anti-forgery token با استفاده Tag Helper از اعمال شده است.

1
2
< form asp-action="Edit" >
<button></button>

Form Tag Helperیک علامت مخفی ضد جعل را تولید می کند که باید با شناسه ضد جعل تولید شده توسط [ValidateAntiForgeryToken]مطابقت داشته باشد در اکشن Editکنترلر Movies .

متد HttpGet ویرایش(Edit)، پارامتر ID فیلم را می گیرد، فیلم را با استفاده از روش Entity Framework SingleOrDefaultAsync به نمایش می گذارد، و فیلم انتخاب شده را به Edit View باز می گرداند. اگر یک فیلم پیدا نشد، NotFound (HTTP 404) بازگردانده می شود.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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);
}
<button></button>

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

هنگامی که سیستم Scaffolding را برای Edit View ایجاد کرد کلاس Movie را مورد بررسی قرار داد و کد ایجاد کرد تا عناصر < label > و < input > را برای هر ویژگی کلاس به نمایش در آورند.

مثال زیر نشان میدهد Edit view توسط سیستم Visual Studio scaffolding تولید شده است :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@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");}
}
<button></button>

توجه کنید که قالب 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 تولید شده برای عنصر

در زیر نشان داده شده است.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
< 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 >
<button></button>

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

Processing the POST Request

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// POST: Movies/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
[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);
}
<button></button>

ویژگی [ValidateAntiForgeryToken] نشانگر مخفی XSRF تولید شده توسط ژنراتور جعلی ضد جعل را در Helper Form Tag تایید می کند.

سیستم model Binding، مقادیر فرم ارسال شده را می گیرد و یک شیء فیلم را به عنوان پارامتر فیلم منتقل می کند متد ModelState.IsValid تایید می کند که داده های ارائه شده در فرم را می توان برای تغییر (ویرایش یا به روز رسانی) یک شیء فیلم مورد استفاده قرار داد. اگر داده معتبر باشد ذخیره می شود. داده های فیلم به روز شده (ویرایش شده) با فراخوانی روش SaveChangesAsync از پایگاه داده ذخیره می شود. پس از ذخیره داده ها، کد کاربر را به روش Action Index از MovieController کلاس هدایت می کند، که مجموعه فیلم را نمایش می دهد، از جمله تغییرات انجام شده.

قبل از اینکه فرم به سرور ارسال شود، اعتبارسنجی سمت سرویس گیرنده، هر یک از قوانین اعتبارسنجی در زمینه را بررسی می کند. اگر خطاهای اعتبار سنجی وجود دارد، یک پیام خطا نمایش داده می شود و فرم ارسال نشده است. اگر جاوا اسکریپت غیرفعال باشد، شما اعتبارسنجی سمت سرویس گیرنده را نخواهید داشت اما سرور مقادیر ارسال شده معتبر را تشخیص می دهد و مقادیر فرم با پیام های خطا نمایش داده می شوند. Validation Tag Helper در قالب Views/Movies/Edit.cshtml خطاهای مناسب را نمایش می دهد.

آموزش Asp.net Core

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

1396/07/20 5255 1735
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

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