نحوه استفاده از ViewModel در ASP.NET MVC
نویسنده: سیروان عفیفی
تاریخ: ۱۳۹۱/۱۲/۱۳ ۱۴:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
یک Model چیست؟
· قسمتی از Application است که Domain Logic را پیاده سازی میکند.
· همچنین با عنوان Business Logic نیز شناخته میشود.
· Domain Logic دادههایی را که بین UI و دیتابیس پاس داده میشود، مدیریت میکند.
· برای مثال، در یک سیستم انبار،Model کارش ذخیره سازی اقلام در حافظه و Logic تعیین کننده موجود بودن یک آیتم در انبار میباشد.
یک ViewModel چیست؟
· ViewModel به ما این امکان را میدهد تا از چندین Entity، یک شیء واحد بسازیم.
· بهینه شده برای استفاده و رندر توسط یک View
مکان قرارگیری ViewModel در پروژه بهتر است کجا باشد؟
Best Practice هایی در زمان استفاده از ViewModelها
در یک View میخواهیم هم لیست اخبار سایت و هم لیست سخنرانان سایت (مثال مربوط به یک پروژه برای همایش است) را نمایش دهیم. خوب طبق مطالب فوق استفاده از ViewModel بهترین راه حل است. ViewModel مربوطه به صورت زیر تعریف شده است :
public class SpeakerAndNewsViewModel
{
public IEnumerable<News> News { get; set; }
public IEnumerable<Speaker> Speakers { get; set; }
}public ActionResult Index()
{
var news = db.News.OrderBy(r=>r.Date)
.Take(3);
var speakers = db.Speakers.Take(4);
var model = new SpeakerAndNewsViewModel {
News=news,
Speakers=speakers
};
return View(model);
}@model Project.Models.SpeakerAndNewsViewModel
@{
ViewBag.Title = "Home Page";
}
@section news
{
@foreach (var item in Model.News)
{
//..
}
}
@section speakers
{
@foreach (var item in Model.Speakers)
{
//...
}
}·ViewModel به ما این امکان را میدهد تا از چندین Entity یک شیء واحد بسازیم.
من فکر میکنم ViewModel ، مدل مورد نیاز برای یک View را فراهم میکند و لزوما برای این نیست از چند موجودیت دیتابیسی یک شیء بسیازیم و به View پاس دهیم.
·قسمتی از Application است که Domain Logic را پیاده سازی میکند.
·همچنین با عنوان Business Logic نیز شناخته میشود.
Public Class PersonModel
{
long Id{get;set;}
string Name{get;set;}
}Public Class PersonModel
{
long Id{get;set;}
string Name{get;set;}
int SavePerson(person p);
Person Finde(long personId);
}برای اتصال ViewModel به مدل مینویسیم: یک خاصیت viewmodel ،خودت رو به یک خاصیت model انتساب بده پدرجان! همین! (البته حالت پیشرفتهتر استفاده از AutoMapper هست که نخوای اینها رو اگه سختت هست دستی بنویسی)
خواص مدل رابطه یک به یک داره با جدول شما در بانک اطلاعاتی. اون هم اطلاعاتش نیاز به اعتبار سنجی داره. ViewModel هم نیاز داره چون یک سری خاصیت اضافی عموما داره که در بانک اطلاعاتی نیست و فقط در View تعریف شده.
protected void Application_Start()
{
//مپ کردن مدل به ویومدل
Mapper.CreateMap<DomainClasses.Product, ProductListVM>();
//مپ کردن ویومدل به مدل
Mapper.CreateMap<ProductCreateVM,DomainClasses.Product>();
}public ActionResult ShowList()
{
var productList = _cotext.Products.ToList();
//انتصاب
var viewmodel = Mapper.Map<List<domain.Products>, List<ProductListVM>>(productList);
return View(viewmodel);
}[HttpPost]
public virtual ActionResult Create(ProductCreateVM product)
{
try
{
if (ModelState.IsValid)
{
var model = Mapper.Map<ProductCreateVM, domain.Product>(product);
_cotext.Products.Add(model);
_cotext.SaveChanges();
return RedirectToAction(ShowList);
}
return View(product);
}
catch
{
}
}public class ResumeViewModel
{
public ResumeViewModel()
{
}
public ResumeViewModel(IEnumerable<Resume> resum, IEnumerable<Work_Experience_Job_Seeker> workExperienceJobSeekerOfViewModel, IEnumerable<Job_Expertises> jobExpertisesOfViewModel, IEnumerable<Degrees_Work_Experience_Required> degreesWorkExperienceRequiredOfViewModel, IEnumerable<Specialized_Course> specializedCourseOfViewModel, IEnumerable<Book_Published> bookPublishedOfViewModel, IEnumerable<Basic_Table> basicTable)
{
ResumeOfViewModel = resum;
WorkExperienceJobSeekerOfViewModel = workExperienceJobSeekerOfViewModel;
JobExpertisesOfViewModel = jobExpertisesOfViewModel;
DegreesWorkExperienceRequiredOfViewModel = degreesWorkExperienceRequiredOfViewModel;
SpecializedCourseOfViewModel = specializedCourseOfViewModel;
BookPublishedOfViewModel = bookPublishedOfViewModel;
BasicTable = basicTable;
}
public IEnumerable<Resume> ResumeOfViewModel { get; set; }
public IEnumerable<Work_Experience_Job_Seeker> WorkExperienceJobSeekerOfViewModel { get; set; }
public IEnumerable<Job_Expertises> JobExpertisesOfViewModel { get; set; }
public IEnumerable<Degrees_Work_Experience_Required> DegreesWorkExperienceRequiredOfViewModel { get; set; }
public IEnumerable<Specialized_Course> SpecializedCourseOfViewModel { get; set; }
public IEnumerable<Book_Published> BookPublishedOfViewModel { get; set; }
public IEnumerable<Basic_Table> BasicTable { get; set; }
public int NumberForm { get; set; } // EditResumes.chtml & ShowResumes.chtml ===> baraye select kardan formha :D
} [HttpGet]
public ActionResult EditResumes(int id)
{
var contex = new Final_My_ProjectEntities2();
var res1 = contex.Resumes.Where(rec => rec.Resume_ID == id);
var res2 = contex.Work_Experience_Job_Seeker.Where(rec => rec.Resume_ID == id).ToList();
var res3 = contex.Job_Expertises.Where(rec => rec.Resume_ID == id).ToList();
var res4 = contex.Degrees_Work_Experience_Required.Where(rec => rec.Resume_ID == id).ToList();
var res5 = contex.Specialized_Course.Where(rec => rec.Resume_ID == id).ToList();
var res6 = contex.Book_Published.Where(rec => rec.Resume_ID == id).ToList();
var res12 = contex.Basic_Table.ToList();
var viewModel = new ResumeViewModel(res1, res2, res3, res4, res5, res6,res12);
var items = new SelectList(
new[]
{
new {Value = "1", Text = "فرم مهارت ها"},
new {Value = "2", Text = "فرم کتاب/مقالات منتشر شده"},
new {Value = "3", Text = "فرم سابقه کاری"},
new {Value = "4", Text = "فرم دورههای تخصصی گذرانده"},
new {Value = "5", Text = "فرم تخصصهای شغلی"},
new {Value = "6", Text = "فرم مدارک تحصیلی"}
},
"Value", "Text");
ViewBag.Form = new SelectList(items, "Value", "Text");
var res7 = contex.Basic_Table.Where(rec => rec.Domain == "MilitaryStatus").ToList();
ViewBag.MilitaryStatus = new SelectList(res7, "Value", "Meaning",res1);
var res8 = contex.Basic_Table.Where(rec => rec.Domain == "Sex");
ViewBag.Sex = new SelectList(res8, "Value", "Meaning", res1);
var res9 = contex.Basic_Table.Where(rec => rec.Domain == "MartialStatus").ToList();
ViewBag.MartialStatus = new SelectList(res9, "Value", "Meaning", res1);
var res10 = contex.Basic_Table.Where(rec => rec.Domain == "Degree").ToList();
ViewBag.Degree = new SelectList(res10, "Value", "Meaning");
var res11 = contex.Basic_Table.Where(rec => rec.Domain == "Ability").ToList();
ViewBag.Ability = new SelectList(res11, "Value", "Meaning");
return View(viewModel);
}@model Final_My_Project.ViewModels.ResumeViewModel
@{
ViewBag.Title = "ویرایش رزومه";
ViewBag.PartOne = "فرم مهارت ها";
ViewBag.PartTwo = "فرم کتاب/مقالات منتشر شده";
ViewBag.Part3 = "فرم سابقه کاری";
ViewBag.Part4 = "فرم دورههای تخصصی گذرانده";
ViewBag.Part5 = "فرم تخصصهای شغلی";
ViewBag.Part6 = "فرم مدارک تحصیلی";
}
<h2 style="font-family: Arial;">@ViewBag.Title</h2><br/>
<script type="text/javascript">
$(function () {
$('#Gender').change(function () {
var selectKind = $(this).find('option:selected').text();
var divMilitary;
if (selectKind == "زن") {
divMilitary = $('#Military');
divMilitary.hide();
divMilitary.css('display', 'none');
}
else if (selectKind == "مرد") {
divMilitary = $('#Military');
divMilitary.show();
divMilitary.css('display', 'block');
}
});
});
</script>
<script type="text/javascript">
$(function () {
$('#SelectForm').change(function () {
var selectFrom = $(this).find('option:selected').text();
if (selectFrom == "فرم مهارت ها") {
$('#PartOne').show();
$('#PartOne').css('display', 'block');
$('#PartTwo').hide();
$('#PartTwo').css('display', 'none');
$('#Part3').hide();
$('#Part3').css('display', 'none');
$('#Part4').hide();
$('#Part4').css('display', 'none');
$('#Part5').hide();
$('#Part5').css('display', 'none');
$('#Part6').hide();
$('#Part6').css('display', 'none');
}
if (selectFrom == "فرم کتاب/مقالات منتشر شده") {
$('#PartTwo').show();
$('#PartTwo').css('display', 'block');
$('#PartOne').show();
$('#PartOne').css('display', 'none');
$('#Part3').hide();
$('#Part3').css('display', 'none');
$('#Part4').hide();
$('#Part4').css('display', 'none');
$('#Part5').hide();
$('#Part5').css('display', 'none');
$('#Part6').hide();
$('#Part6').css('display', 'none');
}
if (selectFrom == "فرم سابقه کاری") {
$('#Part3').show();
$('#Part3').css('display', 'block');
$('#PartTwo').hide();
$('#PartTwo').css('display', 'none');
$('#PartOne').show();
$('#PartOne').css('display', 'none');
$('#Part4').hide();
$('#Part4').css('display', 'none');
$('#Part5').hide();
$('#Part5').css('display', 'none');
$('#Part6').hide();
$('#Part6').css('display', 'none');
}
if (selectFrom == "فرم دورههای تخصصی گذرانده") {
$('#Part4').show();
$('#Part4').css('display', 'block');
$('#PartTwo').hide();
$('#PartTwo').css('display', 'none');
$('#PartOne').show();
$('#PartOne').css('display', 'none');
$('#Part3').hide();
$('#Part3').css('display', 'none');
$('#Part5').hide();
$('#Part5').css('display', 'none');
$('#Part6').hide();
$('#Part6').css('display', 'none');
}
if (selectFrom == "فرم تخصصهای شغلی") {
$('#Part5').show();
$('#Part5').css('display', 'block');
$('#PartTwo').hide();
$('#PartTwo').css('display', 'none');
$('#PartOne').show();
$('#PartOne').css('display', 'none');
$('#Part3').hide();
$('#Part3').css('display', 'none');
$('#Part4').hide();
$('#Part4').css('display', 'none');
$('#Part6').hide();
$('#Part6').css('display', 'none');
}
if (selectFrom == "فرم مدارک تحصیلی") {
$('#Part6').show();
$('#Part6').css('display', 'block');
$('#Part5').show();
$('#Part5').css('display', 'none');
$('#PartTwo').hide();
$('#PartTwo').css('display', 'none');
$('#PartOne').show();
$('#PartOne').css('display', 'none');
$('#Part3').hide();
$('#Part3').css('display', 'none');
$('#Part4').hide();
$('#Part4').css('display', 'none');
}
});
});
</script>
@Html.DropDownListFor(m=>m.NumberForm, (SelectList)ViewBag.Form, new { id = "SelectForm" })
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<div id="PartOne" >
<h3 style="font-family: Arial; color: #008080; font-weight: bold; ">@ViewBag.PartOne</h3><br/>
@foreach (var item in Model.ResumeOfViewModel)
{
<table dir="rtl">
<tr>
<td>
@Html.Label("عنوان رزومه")
</td>
<td>
@Html.TextBoxFor(model =>item.Title_Of_Resume , new {@class = "text", style = "width:100 px"})
@Html.ValidationMessageFor(model => item.Title_Of_Resume)
</td>
</tr>
<tr>
<td>
<div id="Gender" >
@Html.Label("نوع جنسیت")
@Html.DropDownList("نوع جنسیت", new SelectList(ViewBag.Sex,
"Value", "Text", item.Sex_ID == 0 ? 0 : item.Sex_ID))
@Html.ValidationMessageFor(model => item.Sex_ID)
</div>
</td>
<td>
<div >
@Html.Label("وضعیت تاهل")
@Html.DropDownList("وضعیت تاهل", new SelectList(ViewBag.MartialStatus,
"Value", "Text", item.Martial_Status_ID == 0 ? 0 : item.Martial_Status_ID))
@Html.ValidationMessageFor(model => item.Martial_Status_ID)
</div>
</td>
</tr>
<tr id="Military" style="display: none;">
<td>
@Html.Label("وضعیت نظام وظیفه")
</td>
<td>
@Html.DropDownList("وضعیت نظام وظیفه", new SelectList(ViewBag.MilitaryStatus,
"Value", "Text", item.Military_Status_ID == 0 ? 0 : item.Military_Status_ID), new { id = "Gender" })
@Html.ValidationMessageFor(model => item.Military_Status_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("آشنایی با رایانه")
</td>
<td>
@Html.DropDownListFor(model => item.Knowledge_Of_Computers_ID, (SelectList)ViewBag.Ability)
@Html.ValidationMessageFor(model => item.Knowledge_Of_Computers_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("آشنایی با امور اداری و دفتری")
</td>
<td>
@Html.DropDownListFor(model => item.Knowledge_Administrative_and_Clerical_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model => item.Knowledge_Administrative_and_Clerical_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("آشنایی با زبان انگلیسی")
</td>
<td>
@Html.DropDownListFor(model => item.Knowledge_Of_English_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model => item.Knowledge_Of_English_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("آشنایی با زبان عربی")
</td>
<td>
@Html.DropDownListFor(model => item.Knowledge_Of_Arabic_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model => item.Knowledge_Of_Arabic_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("آشنایی با ماکروسافت آفیس")
</td>
<td>
@Html.DropDownListFor(model =>item.Knowledge_Of_Office_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model => item.Knowledge_Of_Office_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("آشنایی با امور مالی و حسابداری")
</td>
<td>
@Html.DropDownListFor(model =>item.Knowledge_Of_Finance_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model => item.Knowledge_Of_Finance_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("آشنایی با مدیریت")
</td>
<td>
@Html.DropDownListFor(model =>item.Knowledge_Of_Manage_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model =>item.Knowledge_Of_Manage_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("گواهینامه رانندگی پایه یک")
</td>
<td>
@Html.DropDownListFor(model =>item.Driving_license_One_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model =>item.Driving_license_One_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("گواهینامه رانندگی پایه دو")
</td>
<td>
@Html.DropDownListFor(model =>item.Driving_license_Two_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model =>item.Driving_license_Two_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("گواهینامه رانندگی پایه موتورسیکلت")
</td>
<td>
@Html.DropDownListFor(model =>item.Certificate_Motor_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model =>item.Certificate_Motor_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("ماشین شخصی")
</td>
<td>
@Html.DropDownListFor(model =>item.Personal_Vehicle_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model =>item.Personal_Vehicle_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("روابط عمومی")
</td>
<td>
@Html.DropDownListFor(model =>item.Public_Relationship_ID, (SelectList) ViewBag.Ability)
@Html.ValidationMessageFor(model =>item.Public_Relationship_ID)
</td>
</tr>
<tr>
<td>
@Html.Label("دیگر توانایی ها")
</td>
<td>
@Html.EditorFor(model =>item.Etc_Ability)
@Html.ValidationMessageFor(model =>item.Etc_Ability)
</td>
</tr>
</table>
}
</div>
<p>
<input type="submit" value="Save" onclick="return confirm('از ثبت اطلاعات مطمئن هستید؟')" />
</p>
}
<div>
@Html.ActionLink("بازگشت به مدیریت رزومه ها", "ManageOfResumes")
</div>
@section scripts {
@Scripts.Render("~/bundles/jqueryval")
} [HttpPost]
public ActionResult EditResumes(ResumeViewModel model) // model null mishe ! CHERAA??!
{
var contex = new Final_My_ProjectEntities2();
try
{
if (ModelState.IsValid)
{
// Code... che cody?
contex.SaveChanges();
}
}
catch (Exception)
{
ViewBag.wrong = "لطفا دادههای ورودی را بررسی نمایید";
}
return View(model);
}@using (Html.BeginForm(actionName: "EditResume", controllerName: "SomeName"))
{
} public class ProjectViewModel{
public ProjectDto Project{ get; set; }
public ProjectProgramDto ProjectProgram { get; set}
public IEnumerable<SelectListItem> PriorityListItems { get; set; }
}یک رایگیری در این مورد در حال انجام است
Either ErrorMessageString or ErrorMessageResourceName must be set, but not both.
var models = from x in db.tblFinalProjects
select x;
{
PTitle=x.xProjectTitle,
ZTitle=x.tblZone.xCaption,
PLastProgress=x.xLastProgress,
PStatus=x.tblCurrentStatu.xCaption,
PMasool="",
}; public class MyViewModel
{
public string PTitle {set;get;}
// مابقی خواص در اینجا
}
var list = from x in db.tblFinalProjects
select new MyViewModel
{
PTitle=x.xProjectTitle,
ZTitle=x.tblZone.xCaption,
PLastProgress=x.xLastProgress,
PStatus=x.tblCurrentStatu.xCaption,
PMasool="",
};