نحوه استفاده از ViewModel در ASP.NET MVC

منتشر شده ۱۳ اسفند ۱۳۹۱DNTips

این نوشته نخستین بار در دات‌نت تیپس منتشر شده است.

یک Model چیست؟

·   قسمتی از Application است که Domain Logic را پیاده سازی می‌کند.

·   همچنین با عنوان Business Logic نیز شناخته می‌شود.

·   Domain Logic داده‌هایی را که بین UI و دیتابیس پاس داده می‌شود، مدیریت می‌کند.

·   برای مثال، در یک سیستم انبار،Model   کارش ذخیره سازی اقلام در حافظه و Logic تعیین کننده موجود بودن یک آیتم در انبار میباشد.


یک ViewModel چیست؟

·   ViewModel به ما این امکان را میدهد تا از چندین Entity، یک شیء واحد بسازیم.

·   بهینه شده برای استفاده و رندر توسط یک View

 

چرا باید از ViewModel استفاده کنیم؟

  • اگر شما بخواهید چندین Model را به یک View پاس دهید، استفاده از ViewModel ایده بسیار خوبی است.
  • همچنین امکان Validate کردن ViewModel را به روشی متفاوت‌تر از Domain Model برای سناریوهای اعتبارسنجی attribute-based را در اختیارمان قرار میدهد.
  • برای قالبندی داده‌ها نیز استفاده میشود.
        o برای مثال به یک داده یا مقدار پولی قالبندی شده به یک روش خاص نیاز داریم؟
ViewModel بهترین مکان برای انجام این کار است.
  • استفاده از ViewModel تعامل بین Model و View را ساده‌تر می‌کند.  


مکان قرارگیری ViewModel در پروژه بهتر است کجا باشد؟

  1. می‌تواند در یک پوشه با نام ViewModel در ریشه پروژه باشد.

  2. به صورت یک dll ارجاع داده شده به پروژه. 
  3. در یک پروژه جدا به عنوان یک Service Layer.


Best Practice هایی در زمان استفاده از ViewModelها 

  1. داده‌هایی را که قرار است در View رندر شوند، داخل ViewModel قرار دهید.
  2. View باید خصوصیاتی را که نیاز دارد، مستقیما از ViewModel بدست بیاورد.
  3. وقتی که ViewModel شما پیچیده‌تر می‌شود، بهتر است از یک Mapper استفاده کنید.

اجازه دهید مثالی را در این رابطه براتون بیارم :

در یک View می‌خواهیم هم لیست اخبار سایت و هم لیست سخنرانان سایت (مثال مربوط به یک پروژه برای همایش است) را نمایش دهیم. خوب طبق مطالب فوق استفاده از ViewModel بهترین راه حل است. ViewModel مربوطه به صورت زیر تعریف شده است :

public class SpeakerAndNewsViewModel
    {
        public IEnumerable<News> News { get; set; }
        public IEnumerable<Speaker> Speakers { get; set; }
    }
و در اکشن متد Index هم بدین صورت Model‌ها را به ViewModel ساخته شده پاس می‌دهیم :
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);
        }
و یک View را به صورت Strongly Typed از نوع ViewModel خود که در اینجا SpeakerAndNewsViewModel  است ایجاد می‌کنیم :

و View مربوطه را به شکل زیر تغییر می‌دهیم :  
@model  Project.Models.SpeakerAndNewsViewModel
@{
    ViewBag.Title = "Home Page";
}
@section news
{
@foreach (var item in Model.News)
{
    //..
}
}
@section speakers
{
@foreach (var item in Model.Speakers)
{
    //...
}
}