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

آموزش MVC Core - بررسی Details و متد Delete در MVC Core

آموزش MVC Core - بررسی Details و متد Delete در MVC Core

فایل کنترلر Movie را باز کرده و متد Details را بررسی کنید:

// 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);
}

MVC scaffolding engine که این متد action را ایجاد کرده است یک comment را نشان می دهد که درخواست HTTP است که متد را فراخوانی می کند. در این مورد این یک درخواست GET با سه قسمت URL، Movies controller، Details method و مقدار id است. به یاد بیاورید که این بخش ها در Startup.cs تعریف شده اند.

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

Entity FramewWork کار جستجو داده ها را با استفاده از SingleOrDefaultAsync آسان کرده است. ویژگی امنیتی مهم ساخته شده در این روش این است که کد متد جستجو را قبل از جستجو شدن فیلمی برای انجام هر کاری با آن معتبر می کند. به عنوان مثال، یک هکر می تواند با تغییر URL ایجاد شده توسط لینک های (http://localhost:xxxx/Movies/Details/1) به چیزی مانند (http://localhost:xxxx/Movies/Details/12345) یا مقدار دیگری که فیلم واقعی را نمایش نمی دهد.

اگر شما یک null movie را چک نکرده باشید برنامه یک استثنا (exception) می دهد.

متد Delete و تایید Delete را بررسی کنید:

// GET: Movies/Delete/5
public async Task< IActionResult > Delete(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);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task< IActionResult > DeleteConfirmed(int id)
{
    var movie = await _context.Movie.SingleOrDefaultAsync(m = > m.ID == id);
    _context.Movie.Remove(movie);
    await _context.SaveChangesAsync();
    return RedirectToAction("Index");
}

توجه داشته باشید که متد HTTP GET Delete فیلمی را حذف نمی کند بلکه یک View از فیلم را به کاربر نشان می دهد تا با تایید(Submit) کردن آن را برای (HttpPost) ارسال کند. انجام یک عملیات حذف در پاسخ به یک GET request (یا برای آن موضوع، انجام عملیات edit ، عملیات create ، و یا هر عملیات دیگری که داده ها را تغییر می دهد) یک سوراخ امنیتی باز می کند.

روش [HttpPost] که داده ها را حذف می کند، DeleteConfirmed نامیده می شود تا روش HTTP POST یک امضا (signature) یا نام منحصر به فرد باشد. امضای دو روش در زیر نشان داده شده است:

/ GET: Movies/Delete/5
public async Task< IActionResult > Delete(int? id)
{

// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task< IActionResult > DeleteConfirmed(int id)
{

common language runtime (CLR) برای بارگذاری این متد نیاز به یک پارامتر امضای (parameter signature) منحصر به فرد دارد.( نام متد همان، اما لیستی از پارامترهای مختلف). با این حال، در اینجا شما نیاز به دو روش حذف - یکی برای GET و دیگری برای POST - که هر دو پارامتر امضای (parameter signature) مشابه دارند. (هر دو آنها باید یک عدد صحیح واحد را به عنوان یک پارامتر قبول کنند).

دو روش برای این مشکل وجود دارد، که برای متدها نام های مختلف انتخاب کنید. این چیزی است که ساز و کار scaffolding در مثال قبلی انجام داد. با این حال، این یک مشکل کوچک را نشان می دهد:Asp.Net نقشه های بخش URL اکشن را بر اساس نام، و اگر شما یک اکشن را تغییر نام دهید routing به طور معمول نمی تواند این اکشن را پیدا کند. راه حل چیزی است که شما در مثال می بینید، این است که نام ActionName("Delete") را به جای DeleteConfirmed انتخاب کنیم.این ویژگی باعث می شود که سیستم مسیریابی(routing system) بتواند URL که شامل /Delete/ برای یک POST request از متد DeleteConfirmed پیداکند.

یکی دیگر از کارهای رایج برای روش هایی که دارای اسم ها و امضا های یکسان هستند، به طور مصنوعی یک امضای برای متد POST مانند (unused) اضافه کنیم. این همان چیزی است که ما در یک پست قبلی انجام دادیم وقتی پارامتر notUsed را اضافه کردیم. شما می توانید همین روش را برای [HttpPost] Delete method امتحان کنید :

// POST: Movies/Delete/6
[ValidateAntiForgeryToken]
public async Task< IActionResult > Delete(int id, bool notUsed)

و در اینجا تشکر می کنم از اینکه دوره introduction to ASP.NET Core MVC تکمیل کردید و به پایان رساندید.

1397/02/30 2365 1080
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

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