ما یک مدل برای Database و فیلد های آن در جلسه قبل ایجاد کردیم. در این جلسه قصد داریم تا یک مدل معادل هم برای سمت کاربر ایجاد کنیم. مثلا مدلی که با نام User در جلسه قبل ایجاد کردیم دارای تعدادی پراپرتی است مثل UserID, Name, Family و … اما شاید در یک صفحهایی فقط نیاز داشته باشیم با نام و نام خانوادگی و رمز عبور کار کنیم و اصلا نیازی به فیلدهای دیگر نداشته باشیم و همچنین بخواهیم روی این فیلدها dataAnnotation های دیگری هم داشته باشیم.
حالا میتوانیم برای آن صفحه خاص و برای آن بخش از پروژه یک مدل خاص طراحی کنیم که از روی آن صفحات مورد نظر خود را بسازیم، در واقع View Model ها، مدل هایی هستند که از روی آنها طراحی ظاهری را انجام میدهیم و کاربر با آنها در تعامل است اما میدانیم که مدلهای اصلی که به آنها data model می گوییم با دیتابیس در ارتباط هستند.
همچنین گاهی اوقات در یک پروژهی MVC نیاز داریم که چندین Model را به یک View ارسال کنیم ، خب در این مواقع چه باید بکنیم ؟ خب راه چاره استفاده از ViewModel هست ، در معماری ام وی سی (MVC) ، ViewModel ، بسیار شبیه به Model است با این تفاوت که از ویو مدل (ViewModel) برای ارسال چندین Model به یک View استفاده میشود.
اگر شما بخواهید چندین Model را به یک View پاس دهید، استفاده از ViewModel ایده بسیار خوبی است.
در استفاده از View Model ها با ۳ حالت روبرو میشویم که به شرح ذیل است:
از ویو مدل ها میتوان برای نمایش اطلاعات استفاده کرد مثلا زمانی که قرار است لیست کاربران را نمایش دهیم
var users = db.Users.Select(t => new { t.UserID, t.ImageUrl, t.Name, t.Family }).ToList();
List<UserListViewModel> list = new List<UserListViewModel>();
گام جهارم : حال باید لیست خود که از جنس مدل اصلی بود را در لیستی که از جنس ویو مدل است بریزیم.
foreach (var user in users)
{
list.Add(new UserListViewModel
{
UserID = user.UserID,
Family = user.Family,
ImageUrl = user.ImageUrl,
Name = user.Name
});
}
return View(list);
مشاهده کد ها به صورت یک جا
public ActionResult Index()
{
var users = db.Users.Select(t => new { t.UserID, t.ImageUrl, t.Name, t.Family }).ToList();
List<UserListViewModel> list = new List<UserListViewModel>();
foreach (var user in users)
{
list.Add(new UserListViewModel
{
UserID = user.UserID,
Family = user.Family,
ImageUrl = user.ImageUrl,
Name = user.Name
});
}
return View(list);
}
توجه داشته باشید که در این روش باید اطلاعات از مدل اصلی به ویو مدل نگاشت شود.
با استفاده از ویو مدل ها میتوانیم اطلاعات را از سمت ویو به اکشن ببریم، مثلا فرمی برای ایجاد یک کاربر ایجاد کنیم و یا صفحه رجیستر بسازیم و اطلاعات کاربر را به سمت اکشن ببریم و از آنجا در دیتابیس ذخیره کنیم.
public ActionResult Create()
{
return View();
}
public ActionResult Create([Bind(Include = "UserID,Name,Family,Password,RePassword,Email,MobileNumber,Gender")] UserRegisterViewModel UserRegisterViewModel)
{
return View(UserRegisterViewModel);
}
User MyUser = new User() {
Name = UserRegisterViewModel.Name,
Family = UserRegisterViewModel.Family,
Password = UserRegisterViewModel.Password,
Email = UserRegisterViewModel.Email,
MobileNumber = UserRegisterViewModel.MobileNumber,
Gender = UserRegisterViewModel.Gender,
RegisterDate = DateTime.Now,
IsActive = true
};
db.Users.Add(MyUser);
db.SaveChanges();
مشاهده کد ها به صورت یک جا
public ActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "UserID,Name,Family,Password,RePassword,Email,MobileNumber,Gender")] UserRegisterViewModel UserRegisterViewModel)
{
if(ModelState.IsValid)
{
User MyUser = new User() {
Name = UserRegisterViewModel.Name,
Family = UserRegisterViewModel.Family,
Password = UserRegisterViewModel.Password,
Email = UserRegisterViewModel.Email,
MobileNumber = UserRegisterViewModel.MobileNumber,
Gender = UserRegisterViewModel.Gender,
RegisterDate = DateTime.Now,
IsActive = true
};
db.Users.Add(MyUser);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(UserRegisterViewModel);
}
توجه داشته باشید که در این روش باید اطلاعات از ویو به مدل اصلی نگاشت شود.
این حالت ترکیب ۲ حالت فوق است مثلا زمانی که قرار است یک کاربر را ویرایش کنیم اطلاعات را از سمت اکشن به ویو میبریم و پس از تغییرات و ویرایش مجدد آن را به سمت اکشن برمیگردانیم.
سلام آقای احدیان وقت بخیر ، فایل work که در ویدئو استفاده کردید رو از کجا باید دانلود کنیم؟