یکی از رایجترین چالشها در توسعه وب، نمایش اطلاعات از چندین مدل مختلف در یک View است. در این مواقع، نیازی به ترکیب دادهها در مدلهای دامین نداریم، بلکه میتوانیم دادههای هر مدل را به صورت مستقل در یک ViewModel قرار دهیم. این کار ضمن رعایت اصل تفکیک دغدغهها، کد را خواناتر و قابل مدیریتتر میکند. در ادامه با مدیریت و ادغام چند Model با ViewModel در EF Core آشنا میشویم.
در دنیای توسعه وب، یکی از نکات مهم و کلیدی در طراحی، نحوه نمایش و انتقال دادهها به لایه View است. اگرچه مدلهای دامین (Domain Models) برای مدیریت دادههای دیتابیس طراحی شدهاند، اما همیشه برای نیازهای نمایش مناسب نیستند. اینجاست که ViewModel وارد صحنه میشود و مانند پلی میان لایه منطق و رابط کاربری عمل میکند.
ViewModel به ما این امکان را میدهد که بدون تغییر ساختار مدلهای اصلی، دادهها را به شکل قابل نمایش و مناسب برای UI سازماندهی کنیم.
فرض کنید ما ۲ مدل به نام های AppUser و Developer داریم. و قصد داریم هر دو مدل را به یک صفحه ارسال کنیم.
یک ویو مدل با نام ِ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();
}
استفاده از 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>
این ساختار به توسعهدهندگان اجازه میدهد کدی تمیز، قابل مدیریت و قابل توسعه تر آن هم در EF Core 9 بنویسند.