خانه / برنامه نویسی / آموزش MVC برای مبتدیان-جلسه 14- تفاوت UpdateModel و TryUpdateModel
امدادگرافیک

آموزش MVC برای مبتدیان-جلسه 14- تفاوت UpdateModel و TryUpdateModel

در جلسه گذشته در رابطه با تابع UpdateModel صحبت کردیم و این جلسه در باره تفاوت بین UpdateModel و TryUpdateModel بحث میکنیم.

آموزش ASP.NET MVC برای مبتدیان – مقدمه

آموزش ASP.NET MVC برای مبتدیان-جلسه اول

آموزش ASP.NET MVC برای مبتدیان-جلسه دوم

آموزش ASP.NET MVC برای مبتدیان-جلسه سوم

آموزش ASP.NET MVC برای مبتدیان-جلسه چهارم

آموزش ASP.NET MVC برای مبتدیان-جلسه پنجم

آموزش ASP.NET MVC برای مبتدیان-جلسه ششم

آموزش ASP.NET MVC برای مبتدیان-جلسه هفتم

آموزش ASP.NET MVC برای مبتدیان-جلسه هشتم

آموزش ASP.NET MVC برای مبتدیان-جلسه نهم

آموزش ASP.NET MVC برای مبتدیان-جلسه دهم

آموزش ASP.NET MVC برای مبتدیان-جلسه یازدهم

آموزش ASP.NET MVC برای مبتدیان-جلسه دوازدهم

آموزش ASP.NET MVC برای مبتدیان-جلسه سیزدهم

پروژه رو باز کنید، احازه بدید اکشن متد Create_Post در کنترلر Employee رو به صورت زیر کمی تغییر بدیم :

[HttpPost]
        [ActionName("Create")]
        public ActionResult Create_Post()
        {

            var employee = new Employee();
            UpdateModel(employee);
            if (ModelState.IsValid)
            {
                var ebl = new EmployeeBusinessLayer();
                ebl.AddEmployee(employee);
                return RedirectToAction("Index");
            }
            return View();
        }

شرط معتبر بودن رو دو خط پایین تر منتقل کردیم، پروژه رو اجرا کنید و آدرس اکشن متد Create رو باز کنید، حالا بدون اینکه مقداری وارد کنید سعی کنید موردی رو ثبت کنید، درسته پیام خطایی رو میبینید! بخاطر اینکه نوع DepartmentId از نوع int قرار داده شده در مدل پروژه و همونطور که میدونید int نیز Struct است و به این معنی است که نمتواند خالی باشد و باید مقداری وارد شود، اجازه بدید با اضافه کردن یک علامت سوال به این فیلد اون رو به حالت Nullable تغییر بدیم به صورت زیر :

public class Employee
    {
        public int EmployeeId { get; set; }
        public string Name { get; set; }
        public string Gender { get; set; }
        public string City { get; set; }
        public int? DepartmentId { get; set; } // Added ?
    }

بعد از انجام این تغییرات پروژه رو اجرا کنید و فرم رو بدون وارد کردن اطلاعات ثبت کنید، به خطای داده شده دقت کنید :

Procedure or function 'spAddEmployee' expects parameter '@Name', which was not supplied.

این خطا به این معنی هست که نام رو وارد نکردیم، SP مورد نظر رو به خاطر بیارید تمام فیلدها رو اجباری قرار داده بودیم و زمانی که مقداری رو وارد نکنیم و فرم رو ثبت کنیم خطا برای ما نمایش داده میشه، برای حل این مشکل (البته دقت کنید که این موارد مشکل نیستند و ما برای اهداف آموزشی که داریم این کارها رو انجام میدیم) مقادیر رو به Nullable تغییر میدیم، برای این کا ر SP رو به صورت زیر تغییر بدید :

CREATE procedure spAddEmployee
@Name nvarchar(50) = null,
@Gender nvarchar(50) = null,
@City nvarchar(50) = null,
@DepartmentId int  = null
as
Begin
Insert into tblEmployee (Name,Gender,City,DepartmentId)
values (@Name, @Gender, @City, @DepartmentId)
End

دوباره پروژه رو اجرا کنید و فرم خالی رو ثبت کنید، پیغام خطایی که میبینید میگه مقدار خالی رو نمیتونه به انواع دیگه تبدیل کنه، فایل EmployyeBusinessLayer.cs رو باز کنید و به دنبال عبارت زیر بگردید :

employee.DepartmentId = Convert.ToInt32(rdr["DepartmentId"]);

دقت کنید میبینید که این خط در قسمت واکشی مقادیر قرار داره ولی ما در قسمت افزودن مورد جدید با این پیام خطا رو برو شدیم! اجازه بدید مسئله رو دقیق تر بررسی کنیم، بانک اطلاعاتی رو باز کینید و جدول کارمندان رو ببینید، بله یک ردیف Nulll اضافه شده حالا اکشن متد Create_Post رو ببینید، ابتدا عمل افزودن انجام میشه و بعد کاربر به اکشن متد Index از کنترلر Eployee فرستاده میشه اینجاست که کارمندان برای ما واکشی میشوند و پیغام خطا داده میشود، دقت کنید :

public ActionResult Index()
        {

            var ebl = new EmployeeBusinessLayer();
            List<Employee> employees = ebl.Employees.ToList();

            return View(employees);
        }

و اگر به EmployeeBusinessLayer.cs دقت کنید میبینید که مقدار DepartmentId رو به int تبدیل میکنیم ولی مقدار واکشی شده Null یا خالی است که باعث بروز خطا میشود.

یک راه ساده برای حل این مشکل تغییر دادن EmployeeBusinessLayer.cs به شکل زیر هست :

while (rdr.Read())
                    {
                        Employee employee = new Employee();
                        employee.EmployeeId = Convert.ToInt32(rdr["EmployeeId"]);
                        employee.Name = rdr["Name"].ToString();
                        employee.City = rdr["City"].ToString();
                        employee.Gender = rdr["Gender"].ToString();
                        if (!(rdr["DepartmentId"] is DBNull))
                        {
                            employee.DepartmentId = Convert.ToInt32(rdr["DepartmentId"]);
                        }
                        employees.Add(employee);
                    }

حالا پروژه رو اجرا کنید و فرم خالی رو ثبت کنید، میبینید که لیستی از کارمندان رو نمایش میده که چند ریف خالی داریم، برای اینکه فیلدها رو ضروری کنیم یعنی کاربر مجبور به پر کردن فیلدها باشد بهتربن راه استفاده از پراپرتی در مدل است، پنجره Manage NuGet Package for  solution رو از آدرس Tools/NuGet Package Manager باز کنید و از قسمت Installed packages روی EnitytFramwork کلیک کنید و روی دکمه Manage بفشارید و هر دو پروژه رو انتخاب کنید.

حالا به راحتی میتونیم از DataAnnotation استفاده کنیم، فایل Employee.cs رو باز میکنیم و به System.ComponentModel.DataAnnotation یک using میزنیم و از خاصیت (Attribute) استفاده میکنیم :

using System.ComponentModel.DataAnnotations;

و سپس :

public class Employee
    {
        public int EmployeeId { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public string Gender { get; set; }
        [Required]
        public string City { get; set; }
        [Required]
        public int? DepartmentId { get; set; }
    }

پروژه رو اجرا کنید و دوباره سعی کنید یک فرم خالی رو ثبت کنید، بله بازهم پیغام خطا میبینیم! دقت کنید خطا از خط زیر گرفته شده :

UpdateModel(employee);

واین خطا به این خاطر داده میشه که ما فیلدهای کارمند رو ضروری کردیم ولی در فرم اطلاعاتی داده نشد، خوب حالا بجای استفاده از UpdateModel از TryUpdateModel استفاده میکنیم تا تفاوت تفاوت UpdateModel و TryUpdateModel رو بهتر درک کنیم :

[HttpPost]
        [ActionName("Create")]
        public ActionResult Create_Post()
        {

            var employee = new Employee();
            TryUpdateModel(employee);
            if (ModelState.IsValid)
            {
                var ebl = new EmployeeBusinessLayer();
                ebl.AddEmployee(employee);
                return RedirectToAction("Index");
            }
            return View();
        }

دوباره پروژه رو اجرا کنید و فرم خالی رو ثبت کنید و نتیجه رو ببینید!

بله پیغام خطا داده نشد، رکوردی ثبت نشد و فقط جلوی هر فیلدی که ضروری تعریف کرده بودیم (در اینجا تمام فیلدها) پیامی مبنی بر خالی بودن مقدار داده شد و این اصلی ترین تفاوت تفاوت UpdateModel و TryUpdateModel است : UpdateModel در زمان بروز خطا به صفحه مرگ هدایت می مکند ولی TryUpdateModel کاربر را به صفحه مرگ (صفحه خطا) منتقل نمی کند.

TryUpdateModel یک مقدار صحیح یا غلط برمیگرداند که اگر مقدار False برگشت داده شود ModelState.IsValid نیز False میشود و ادامه کدهای درون شرط اجرا نخواهند شد و تنها همین ویو Create به کاربر نمایش داده میشود.

هردو تابع برای آپدیت مدل ما از مقادیر فرم (Form values) استفاده میکنند.

آیا اجباری در انتخاب UpdateModel یا TryUpdateModel داریم؟ خیر اجباری نیست، میتوانید از هر دو گزینه استفاده کنید یعنی همونطور که در جلسات گذشته دیدید میتوانید به صورت زیر هم استفاده کنیم :

[HttpPost]
        [ActionName("Create")]
        public ActionResult Create_Post(Employee employee)
        {

            //var employee = new Employee();
            //TryUpdateModel(employee);
            if (ModelState.IsValid)
            {
                var ebl = new EmployeeBusinessLayer();
                ebl.AddEmployee(employee);
                return RedirectToAction("Index");
            }
            return View();
        }

در این حالت نیز اگر فرم خالی را ثبت کنیم بازهم ویو Create نمایش داده میشود.

در این قسمت با تفاوت UpdateModel و TryUpdateModel آشنا شدیم، امیدوارم دوستان استفاده کرده باشند.

یا حق.

مطلب پیشنهادی

جایگزین تلگرام

پیام رسان هایی که میتوانید جایگزین تلگرام کنید

در این مقاله به ۷ پیام رسانی که میتوانید جایگزین تلگرام کنید معرفی خواهد شد. ...

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

برای مشاهده محصولات به قسمت فروشگاه سایت مراجعه نمایید. رد کردن