با سلام خدمت شما ، امیدوارم که خوب باشید وسلامت ، امروز درموردmvc asp در زمینه Edit View و متدهای Edit میخواستم کمی توضیح بدم امیدوارم که با ماهمراه باشید.در این فصل، view ها و action method های Edit ایجاد شده برای movie controller را بررسی خواهیم کرد. اما اول به بهبود “Release Date” می پردازیم. فایل Models\Movie.cs را باز کرده و خط کدهای رنگی شده ی زیر را به آن اضافه کنید:
using System;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
Namespace MvcMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[Display(Name = “Release Date”)]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = “{0:yyyy-MM-dd}”, ApplyFormatInEditMode =true)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
public class MovieDBContext : DbContext
{
public DbSet Movies { get; set; }
}
}
همچنین می توان date culture (تنظیمات تاریخ ویژه ی زبان آن کشور) را اختصاصی (تنظیم) کرد:
Display(Name = “Release Date”)]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = “{0:d}”, ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
درباره ی DataAnnotation در مبحث بعدی توضیحاتی را ارائه خواهیم داد. خصیصه ی Display مشخص می کند چه چیزی به عنوان اسم فیلد مورد نظر نمایش داده شود (در این نمونه بجای “ReleaseDate” نمایش دهد: “Release Date”). خصیصه ی DataType نوع داده، که در این مورد از نوع date هست، را مشخص می کند تا اطلاعات مربوط به زمان ذخیره شده در فیلد نمایش داده نشود. خصیصه ی DisplayFormat برای رفع خطایی که در مرورگر chrome وجود دارد و فرمت های تاریخ را به صورت نادرست render می کند، مورد نیاز می باشد.
برنامه را اجرا کرده و به Movie controller مراجعه (browse) کنید. حال مکان نمای موس را روی لینک Edit قرار داده تا URL ای که به آن لینک می شود، مشاهده کنید.
لینک Edit توسط متد Html.ActionLink در Views\Movies\Index.cshtml view ایجاد می گردد:
@Html.ActionLink(“Edit”, “Edit”, new { id = item.ID })
شی Html یک helper است که با استفاده از یک خاصیت بر روی کلاس پایه ی System.Web.Mvc.WebViewPage، توابع و خاصیت های کلاس نام برده را برای استفاده در دسترس قرار می دهد. متد ActionLink شی Html، فرایند تولید پویا (dynamic) لینک های HTML که به action method های روی controller متصل (لینک) می شوند را سهل می سازد. اولین آرگومان ارسال شده به متد ActionLink، متن لینک را مشخص می کند (برای مثال Edit Me). دومین آرگومان ارسال شده به متد نام برده، اسم action method ای است که می خواهید فراخوانی شود (به عنوان مثال، Edit action). آخرین آرگومان یک شی تعریف نشده (anonymous object) است که route data را ارائه می دهد (در این مثال ID 4).
لینک ایجاد شده که در تصویر قبلی نمایش داده شد، http://localhost:1234/Movies/Edit/4 می باشد. مسیر (route) پیش فرض (تعریف و ایجاد شده در فایل App_Start\RouteConfig.cs) الگوی URL، {controller}/{action}/{id} را دنبال می کند.از این رو ASP.NET، http://localhost:1234/Movies/Edit/4 را به یک درخواست به متد Edit کنترلر movie که پارامتر ID آن برابر با ۴ می باشد ترجمه می کند. کد زیر گرفته شده از فایل App_Start\RouteConfig.cs را مورد بررسی قرار دهید. متد MapRoute به منظور هدایت یا مسیردهی درخواست های HTTP به controller و action method مربوطه و نیز ارائه نمودن پارامتر اختیاری ID بکار می رود. متد مذکور همچنین توسط html helper ها همچون ActionLink به منظور ایجاد URL هایی که در آن controller، action method و route data تعریف شده باشد، استفاده می شود.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
name: “Default”,
url: “{controller}/{action}/{id}”,
defaults: new { controller = “Home”, action = “Index”,
id = UrlParameter.Optional }
);
}
می توان پارامترهای action method را توسط query string نیز ارسال نمود. به عنوان مثال، آدرس URL ” http://localhost:1234/Movies/Edit?ID=3 ” پارامتر ID که برابر با ۳ می باشد را به متد Edit کنترلر Movies ارسال می کند.
کنترلر Movies را باز کنید. دو متد Edit در زیر نمایش داده شده اند:
// GET: /Movies/Edit/5
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
// 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 ActionResult Edit([Bind(Include = “ID,Title,ReleaseDate,Genre,Price”)] Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction(“Index”);
}
return View(movie);
}
دقت داشته باشید که دومین متد Edit پس از خصیصه ی HttpPost قرار گرفته است. این متد مشخص می کند که overload متد Edit تنها ویژه ی درخواست های POST فراخوانی می شود. می توان خصیصه ی HttpGet را به اولین متد edit اعمال کرد، اما از آنجایی که به صورت پیش فرض اعمال می شود، لزومی به انجام این کار نیست. (به action methods هایی که خصیصه ی HttpGet به آن ها به صورت ضمنی تخصیص می یابد، متدهای HttpGet می گوییم.) خصیصه ی Bind یک سازوکار مهم امنیتی دیگر است که مانع از over-post کردن داده ها توسط هکرها به model شما می شود. شما باید خاصیت های مورد نظر را در خصیصه ی bind ای که می خواهید تغییر دهید، اضافه کنید. در model ساده ای که در این آموزش مورد استفاده قرار می گیرد، تمامی داده ها را در model، bind می کنیم. خصیصه ی ValidateAntiForgeryToken به منظور جلوگیری از جعل درخواست بکار رفته و با تابع ()Html.AntiForgeryToken@ در فایل edit view، (Views\Movies\Edit.cshtml) ست می شود، بخشی از آن را زیر مشاهده می کنید:
@model MvcMovie.Models.Movie
@{
ViewBag.Title = “Edit”;
}
Edit
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
Movie
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.ID)
@Html.LabelFor(model => model.Title, new { @class = “control-label col-md-2” })
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
}
()Html.AntiForgeryToken@ یک نوع پنهان از token ضد جعل ایجاد می کند که باید در متد Edit کنترلر Movies، match شود.
متد HttpGet Edit پارامتر movie ID را گرفته، سپس با استفاده از متد Find تکنولوژی EF، movie را می یابد، همچنین movie انتخابی را به Edit view برمی گرداند. در صورت یافت نشدن movie، HttpNotFound بازگردانده می شود. به هنگام ایجاد Edit view، سیستم scaffolding کلاس Movie را مورد بررسی قرار داده و کدهایی برای render کردن المان های
@model MvcMovie.Models.Movie
@{
ViewBag.Title = “Edit”;
}
Edit
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
Movie
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.ID)
@Html.LabelFor(model => model.Title, new { @class = “control-label col-md-2” })
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
@Html.LabelFor(model => model.ReleaseDate, new { @class = “control-label col-md-2” })
@Html.EditorFor(model => model.ReleaseDate)
@Html.ValidationMessageFor(model => model.ReleaseDate)
@*Genre and Price removed for brevity.*@
}
@Html.ActionLink(“Back to List”, “Index”)
@section Scripts {
@Scripts.Render(“~/bundles/jqueryval”)
}
مشاهده می کنید که دستور @model MvcMovie.Models.Movie در بالای فایل درج گردیده است – دستور ذکر شده به این حقیقت اشاره دارد که view مورد نظر انتظار دارد مدل view template حتما از نوع Movie باشد.
کدهایی که توسط scaffolding ایجاد شده با بهره گیری از چندین helper method، نشانه گذاری های(markup) HTML را ساده و در عین حال کارآمد تر می سازد. Html.LabelFor، اسم فیلد را نمایش می دهد (“Title”، “Release”، “Genre” یا “Price”). خاصیت Html.EditorFor برابر با همان تگ <input> html می باشد. Html.ValidationMessageFor نیز تمامی پیام های اعتبارسنجی مربوط به آن خاصیت را نمایش می دهد.
برنامه را اجرا کرده و به آدرس /Movies پیمایش کنید. بر روی لینک Edit کلیک نمایید، سپس source صفحه ی مورد نظر را در پنجره ی مرورگر مشاهده کنید. HTML المان form در زیر نمایش داده شده:
تگ های داخل یک المان