ویومدل چیست ؟ چگونه چند model را به View ارسال کنیم ؟ چگونه از ViewModel در پروژه های ASP.NET MVC استفاده نماییم ؟ کاربرد ViewModel در ASP.NET MVC چیست ؟ اگر به دنبال یافتن پاسخ این سوالات هستید به هیج عنوان این مقاله آموزشی را از دست ندهید.
سرفصلهای پست
- 1 ViewModel چیست ؟
- 2 نحوه ایجاد ViewModel
- 2.1 ایجاد جدوال در دیتابیس به روش EF CodeFirst
- 2.2 تنظیم Web.Config
- 2.3 ایجاد کلاس Context
- 2.4 فعال کردن Migration
- 2.5 آپدیت کردن دیتابیس و ایجاد دیتابیس
- 2.6 تعریف کلاس برای ViewModel
- 2.7 ایجاد سازنده برای کلاس ViewModel
- 2.8 ایجاد Controller و ActionMethod
- 2.9 واکشی اطلاعات از جداول Student و Professor با LINQ و مقدارهی ViewModel
- 2.10 نمایش اطلاعات ارسال شده با ViewModel در View
ViewModel چیست ؟
گاهی اوقات در یک پروژهی MVC نیاز داریم که چندین Model را به یک View ارسال کنیم ، خب در این مواقع چه باید بکنیم ؟ خب راه چاره استفاده از ViewModel هست ، در معماری ام وی سی (MVC) ، ViewModel ، بسیار شبیه به Model است با این تفاوت که از ویو مدل (ViewModel) برای ارسال چندین Model به یک View استفاده میشود.
نحوه ایجاد ViewModel
به منظور درک بهتر کاربرد ویو مدل و نحوه ایجاد آن در MVC ، این مقاله آموزشی را با یک مثال پیش میبرم، فرض کنید که میخواهیم دو جدول برای درج اطلاعات درون دیتابیس ایجاد نموده سپس اطلاعاتی را از این دو جدول واکشی کرده و در یک View به کاربر نمایش دهیم .
ایجاد جدوال در دیتابیس به روش EF CodeFirst
ابتدا یک پروژه از نوع MVC ایجاد نمایید سپس یک نام دلخواه برای آن انتخاب کنید من نام پروژه خودم را ViewModelProject قرار میدهم. سپس درون پوشهی Model یک کلاس به نام دلخواه ایجاد نموده و فیلدهای جدول Student و Professor را درون آن تعریف کنید. من نام کلاس خودم را MyModel.cs قرار میدهم.
از کلاس MyModel.cs برای ساخت جدول Students و Professors در دیتابیس به روش EF CodeFirst استفاده میشود.
کلاس Student (اطلاعات دانشجویان) و Professor (اطلاعات اساتید)
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; namespace ViewModelProject.Models { public class Student { [Key] public int Id { get; set; } public string Name { get; set; } public string Family { get; set; } public string NationalNo { get; set; } } public class Professor { [Key] public int Id { get; set; } public string Name { get; set; } public string Family { get; set; } public string NationalNo { get; set; } } }
تنظیم Web.Config
حال نوبت به تنظیم Web.Config میرسد کد زیر را بین تگ <configuration> </configuration> قرار دهید.
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(Local);Initial Catalog=ViewModelDB;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
در کد بالا من نام connectionString را DefaultConnection قرار دادم و در قسمت Initial Catalog نام دیتابیس خودم را ViewModelDB انتخاب کردم شما میتوانید نام connectionString و Initial Catalog را با نام دلخواه خودتان ویرایش کنید.
ایجاد کلاس Context
حال در پوشه Model یک کلاس به نام دلخواه با پسوند Context ایجاد نموده و کدهای زیر را درون آن بنویسید. من نام کلاس خودم را ViewModelProjectContext.cs قرار داده ام.
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web; namespace ViewModelProject.Models { public class ViewModelProjectContext : DbContext { public ViewModelProjectContext() : base("name=DefaultConnection") { } public System.Data.Entity.DbSet<ViewModelProject.Models.Student> Student { get; set; } public System.Data.Entity.DbSet<ViewModelProject.Models.Professor> Professor { get; set; } } }
فعال کردن Migration
حالا از منوی بالای ویژوال استدیو گزینه Tools سپس Nuget Package Manager و پس از آن Package Manager Console را انتخاب کنید حال در محیط Package Manager Console دستور زیر را وارد کنید وسپس دکمه Enter را فشار دهید.
Enable-Migrations -ContextTypeName ViewModelProject.Models.ViewModelProjectContext
آپدیت کردن دیتابیس و ایجاد دیتابیس
حالا نوبت به آپدیت کردن دیتابیس میرسد برای این منظور دوباره در محیط Package Manager Console دستور زیر را وارد کرده و سپس دکمه Enter رافشار دهید .
update-database
حالا دیتابیس SQL Server را باز کنید همانطور که مشاهده میکنید در دیتابیس ViewModelDB دو جدول Students و Professors برای شما ایجاد شده است.
تعریف کلاس برای ViewModel
توصیه میشود در پوشه Model یک پوشه به نام ViewModel ایجاد نموده و سپس درون آن یک کلاس برای ViewModel بسازید من نام کلاس ViewModel را CollegeViewModel.cs قرار میدهم .
ایجاد سازنده برای کلاس ViewModel
حال برای ViewModel خود یک سازنده ایجاد نموده و لیستی از مدل های Student و Professor را به عنوان پارامتر های ورودی به این سازنده پاس دهید به صورت زیر :
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ViewModelProject.Models.ViewModel { public class CollegeViewModel { public CollegeViewModel(IEnumerable<Student> Student, IEnumerable<Professor> Professor) { Students = Student; Professors = Professor; } public IEnumerable<Student> Students { get; set;} public IEnumerable<Professor> Professors { get; set; } } }
ایجاد Controller و ActionMethod
حال بر روی پوشه Controller راست کلیک کرده و یک Controller خالی به پروژه خود اضافه نمایید من اسم Controller خودم را College قرار میدهم. سپس درون کنترلر ایجاد شده یک ActionMethod ایجاد نمایید من نام این اکشن متد را Index قرار میدهم .
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace ViewModelProject.Controllers { public class CollegeController : Controller { public ActionResult Index() { return View(); } } }
واکشی اطلاعات از جداول Student و Professor با LINQ و مقدارهی ViewModel
حال درون ActionMethod با دستور LINQ تمام رکوردهای جدول Student و Professor را گرفته و سپس به عنوان پارامتر ورودی سازندهی CollegeViewModel قرار دهید و در انتها این ویو مدل را به ویوی اکشن متد Index ارسال کنید.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using ViewModelProject.Models; using ViewModelProject.Models.ViewModel; namespace ViewModelProject.Controllers { public class CollegeController : Controller { ViewModelProjectContext db = new ViewModelProjectContext(); public ActionResult Index() { var Student = (from s in db.Student select s).ToList(); // دریافت اطلاعات دانشجویان var Professor= (from p in db.Professor select p).ToList(); // دریافت اطلاعات استادان CollegeViewModel ViewModel = new CollegeViewModel(Student, Professor); return View(ViewModel); } } }
نمایش اطلاعات ارسال شده با ViewModel در View
حال یک ویو برای اکشن متد Index بسازید و کدهای زیر درون ویوی Index کپی کنید در کد زیر با دستور foreach اطلاعات مدل Student و مدل Professor ، از دیتابیس واکشی شده و در دوجدول نمایش داده شده است.
@model ViewModelProject.Models.ViewModel.CollegeViewModel @{ ViewBag.Title = "Index"; Layout = null; } <link href="~/Content/bootstrap.min.css" rel="stylesheet" /> <style> .row { direction: rtl !important; width: 60%; margin: 50px auto; } .box-info { margin-bottom: 40px; padding: 20px; border: 1px solid #e7dada; } .table { direction: rtl !important; } .title { padding: 10px; background-color: #e7e7e7; font-size: 18px; } .table th, .table td { text-align: right; } </style> <div class="row"> <div class="box-info"> <p class="title">اطلاعات دانش آموزان</p> <table class="table"> <thead> <tr> <th>نام</th> <th>نام خانوادگی</th> <th>کدملی</th> </tr> </thead> <tbody> <tr> @foreach (var item in Model.Students) { <td> @item.Name </td> <td> @item.Family </td> <td> @item.NationalNo </td> } </tr> </tbody> </table> </div> <div class="box-info"> <p class="title">اطلاعات اساتید</p> <table class="table"> <thead> <tr> <th>نام</th> <th>نام خانوادگی</th> <th>کدملی</th> </tr> </thead> <tbody> <tr> @foreach (var item in Model.Professors) { <td> @item.Name </td> <td> @item.Family </td> <td>@item.NationalNo </td> } </tr> </tbody> </table> </div> </div>
حالا فقط کافیه پروژه خود را اجرا نمایید .
خب به پایان این مقاله آموزشی از سایت میزفا رسیدیم اگر سوالی در رابطه با این مقاله و سایر مقالات آموزشی ASP.NET MVC داشتید حتما در قسمت نظرات این پست مطرح کنید.
منبع : میزفا
21 پاسخ
با سلام و احترام
ببخشید چطور میتونم یه صفحه Detail ایجاد کنم با فراخوانی مدل ویو که بعد بشود چندین مدل را هم فراخوانی کرد؟
فرم Detail :
model ViewModelProject.Models.ViewModel.CollegeViewModel@
@using (Html.BeginForm(“PDPdetail”, “Home”, FormMethod.Post))
{
}
من وقتی میخوام از model ViewModelProject.Models.ViewModel.CollegeViewModel@ استفاده کنم نمیتونم درست فراخوانی کنم کلا خطا میده اگر ممکنه یه فرم Detail ایجاد کنید به همراه چندین مدل اینم ایمیل من
چطور میتوانیم یک فاکتور رو تو mvc طراحی کنیم
سلام امکان داره پیچ بندی کردن جدولم توضیح بدید
سلام ببخشید میشه کدهای مربوط به واکشی اطلاعات از جداول Student و Professor با LINQ و مقدارهی ViewModel را به روش database first بنویسید
ممنون
شما در روش database first در asp.net core هم می تونید از همین کدها استفاده کنید.
سلام
بسیار ساده و روان، دیدم بازتر شد
سلام . خوش حالم براتون مفید بوده.
سلام. در asp.net کنترل gridview داشتیم، و خیلی عالی و پرکاربرد بود، الان در mvc کنترلی با همان توانایی و همان کارکرد وجود داره؟ کمی توضیح بفرمایید
سلام… در asp.net mvc دیگه ابزارهایی مثل grid view رو نداریم و شما باید خودتون در View برای نمایش اطلاعات جدولتون رو کدنویسی کنید … اتفاقا از این بابت که در mvc محدود به استفاده از grid view نیستیم به نظرم mvc خیلی بهتره و دست طراح رو کاملا باز میزاره برای طراحی صفحه .
با سلام
ضمن تشکر از مطالبتون. آیا برای هر جدول در دیتابیس باید یک کلاس در مدل بسازیم؟ و اگر نیاز به یک آبجکت داشتیم که جزئ جداول دیتابیس نبود و از یک یا چند جدول دیتابیس باضافه چند پراپرتی استفاده می کرد و یکسری عملیات حذف و ادیت و…داشت. باید این کلاس کجا ساخته بشه؟ داخل مدل یا ویو مدل
برای مثال کلاس Cart
{ product p {get;set; } int number {get;set;}}
در کلاس کارت؛ یکسری عملیات ، اضافه کردن محصول، حذف محصول و … داریم. کلاس کارت را کجا باید ساخت؟
سلام…خواهش میکنم … شما برای نمایش اطلاعات دیتابیس در ویو و با درج اطلاعات می تونید یا از خود model استفاده کنید و یا یک ViewModel ایجاد کنید معمولا زمانی که می خواهیم از پراپرتی های یک یا چند کلاس توی View استفاده کنیم وچون که نمی تونم از دوتا model در یک View استفاده کنیم از ViewModel استفاده میکنیم و پراپرتی های این دو تا model رو داخل ViewModel تعریف می کنیم.
شما می تونید این کلاس در در هرجایی ایجاد کنید و ازش توی برنامه استفاده کنید ولی من پیشنهاد می کنم که داخل پوشه Models یک پوشه به نام ViewModels ایجاد کنید و ویو مدل هاتون رو داخل این پوشه تعریف کنید.
ممنون از پاسختون. در این حالت ، متدهای add, delete و… مربوط به کلاس کارت رو هم داخل همون کلاس در viewmodel باید گذاشت؟
خواهش میکنم …برای انجام عملیات حذف ، درج و … یک کلاس دیگه ایجاد کنید و این متدها رو داخل این کلاس تعریف کنید.
view model برای نمایش داده ها در لایه ویو هست نه برای ساختن دیتابیس! در واقع view model باید از روی model ها (همون کلاس های انتیتی ) ساخته بشه
بله درست میگید در این مقاله هم عنوان نشده که برای ساختن دیتابیس از Viewmodel استفاده می شود. و در این مقاله هم برای ارسال اطلاعات به ویو از ViewModel استفاده کرده ایم.
پست مفید و خیلی خوبیه، ممنون
خواهش میکنم … خوش حالم براتون مفید بوده
سلام آیا
public CollegeViewModel(IEnumerable Student, IEnumerable Professor)
{
Students = Student;
Professors = Professor;
}
نباید به
public CollegeViewModel(IEnumerable Student, IEnumerable Professor)
{
var Students = Student ;
var Professors = Professor;
}
تغییر داده شود ؟
سلام … نخیر لزومی نداره …. چون زمانی که نوع متغیر مشخص نباشه از var استفاده میکنیم و همین طور که در کدهای بخش ViewModel مشاهده می کنید ما نوع متغیرها رو هم در قسمت سازنده و هم پراپرتی های کلاس ، از نوع <>IEnumerable مشخص نموده ایم. به پراپرتی هایی که بعد از سازنده تعریف شده دقت کنید ما از طریق سازنده این دو پراپرتی رو مقداردهی می کنیم.
لطفا مطلب را دوباره بررسی کنید خیلی اشتباه داره
باسلام …پست مجددا بررسی شد من به مشکلی برنخوردم لطفا اگر اشکالی مشاهده می کنید به محل دقیق اشکال اشاره کنید … ممنون