
مدیریت و ادغام چند Model با ViewModel در EF Core
یکی از رایجترین چالشها در توسعه وب، نمایش اطلاعات از چندین مدل مختلف در یک View است. در این مواقع، نیازی به ترکیب دادهها در مدلهای دامین نداریم، بلکه میتوانیم دادههای هر مدل را به صورت مستقل در یک ViewModel قرار دهیم. این کار ضمن رعایت اصل تفکیک دغدغهها، کد را خواناتر و قابل مدیریتتر میکند. در ادامه با مدیریت و ادغام چند Model با ViewModel در EF Core آشنا میشویم.
هنر طراحی ViewModel در پروژههای واقعی
در دنیای توسعه وب، یکی از نکات مهم و کلیدی در طراحی، نحوه نمایش و انتقال دادهها به لایه View است. اگرچه مدلهای دامین (Domain Models) برای مدیریت دادههای دیتابیس طراحی شدهاند، اما همیشه برای نیازهای نمایش مناسب نیستند. اینجاست که ViewModel وارد صحنه میشود و مانند پلی میان لایه منطق و رابط کاربری عمل میکند. ViewModel به ما این امکان را میدهد که بدون تغییر ساختار مدلهای اصلی، دادهها را به شکل قابل نمایش و مناسب برای UI سازماندهی کنیم.
مراحل ادغام چند Model با ViewModel
فرض کنید ما ۲ مدل به نام های AppUser و Developer داریم. و قصد داریم هر دو مدل را به یک صفحه ارسال کنیم.
- مرحله اول : ساخت یک ViewModel : یک ویو مدل با نام ِDeveloperUserVm ایجاد میکنیم. مانند زیر.
public class DeveloperUserVm
{
public required List<AppUser> AppUsers { get; set; }
public required List<Models.Entities.Developer> Developers { get; set; }
}- مرحله دوم : ساخت کنترلر، اکشن و متد ها : میتوان تمام کد ها را داخل اکشن پیاده سازی کرد. ولی برای اینکه کد کثیف ننویسیم. بهتر است چند متد هم مثل زیر استفاده اضافه کنیم.
public async Task<IActionResult> Index()
{
var DeveloperUser = await CreateDeveloperUserVm();
return View(DeveloperUser);
}
private async Task<DeveloperUserViewModel> CreateDeveloperUserVm()
{
return new DeveloperUserViewModel()
{
AppUsers = await CreateAppUser(),
Developers = await CreateDeveloper(),
};
}
private async Task<List<AppUser>> CreateAppUser()
{
return await _context.appUsers.ToListAsync();
}
private async Task<List<Developer>> CreateDeveloper()
{
return await _context.developers.ToListAsync();
}- مرحله سوم : ساخت View : استفاده از First() در @Html.DisplayNameFor به این دلیل است که @Html.DisplayNameFor نیاز به نمونهای از مدل دارد، با استفاده از First() میتوان یک نمونه از مدل را به آن داد.
@model EFCoreTraining.Models.ViewModel.DeveloperUserViewModel
<div class="table-responsive tehranit-table">
<table class="table align-middle table-bordered table-hover">
<thead>
<tr>
<th>@Html.DisplayNameFor(model => model.Developers.First().Id)</th>
<th>@Html.DisplayNameFor(model => model.Developers.First().Name)</th>
<th>@Html.DisplayNameFor(model => model.Developers.First().Family)</th>
<th>@Html.DisplayNameFor(model => model.Developers.First().Email)</th>
<th>@Html.DisplayNameFor(model => model.Developers.First().Phone)</th>
<th>@Html.DisplayNameFor(model => model.Developers.First().RegisterDate)</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Developers)
{
<tr>
<td>@item.Id</td>
<td>@item.Name</td>
<td>@item.Family</td>
<td>@item.Email</td>
<td>@item.Phone</td>
<td>@item.RegisterDate</td>
</tr>
}
</tbody>
</table>
</div>نکات کلیدی ادغام چند Model با ViewModel
- تفکیک دادهها: هر مدل به صورت مستقل در ViewModel قرار گرفته است. دادهها ترکیب نشدهاند و هر کدام به صورت جداگانه مدیریت میشوند.
- سادگی View: اطلاعات هر مدل به شکل تفکیکشده و منظم در View نمایش داده میشود.
- قابلیت استفاده مجدد: اگر نیاز به تغییر یا گسترش اطلاعات هر مدل باشد، میتوان بخش مربوطه در ViewModel را بدون تأثیر بر سایر قسمتها بهروزرسانی کرد.
این ساختار به توسعهدهندگان اجازه میدهد کدی تمیز، قابل مدیریت و قابل توسعه تر آن هم در EF Core 9 بنویسند.































فرم افزودن دیدگاه
با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.