
ویوهای داینامیک برای روابط یک به چند در EF Core
در آموزش ویوهای روابط یک به چند در EF Core، نحوه نمایش دادههای یک به چند در View بررسی میشود. ابتدا با استفاده از ViewModel دادههای مرتبط را ترکیب کرده. و سپس در یک View در ASP.NET Core MVC نمایش خواهیم داد.
کنترلر PhoneController در ASP.NET Core 9، یک کنترلر استاندارد در معماری MVC است که عملیات ایجاد، نمایش و حذف شماره تلفنهای مرتبط با دانشجویان را مدیریت میکند. این کنترلر از قابلیت Dependency Injection برای ارتباط با سرویسهایی مانند PhoneService، StudentService و EnumService بهره میبرد و وظایفی مانند اعتبارسنجی دادهها و هدایت کاربران به صفحات مناسب را بر عهده دارد. این کنترلر نمونهای عالی برای درک مفاهیم MVC و ارتباط بین کنترلرها و سرویسها است.
کنترلر – Controller تلفن Phone
کنترلر PhoneController در ASP.NET Core 9 مسئول مدیریت عملیات مربوط به شماره تلفنهای دانشجویان است. این کنترلر از الگوی MVC (Model-View-Controller) پیروی کرده و از تکنیکهای پیشرفتهای مانند Dependency Injection برای ارتباط با سرویسها استفاده میکند.
وظایف اصلی PhoneController
- نمایش شماره تلفنها (Index) : این اکشن شماره تلفنهای مربوط به یک دانشجو را بازیابی کرده و به View مربوطه ارسال میکند.
- ایجاد شماره تلفن جدید (Create) : اکشن GET بررسی میکند. آیا StudentId ارسال شده است. در صورت عدم ارسال، خطای NotFound برمیگرداند. اکشن POST آن فرم ارسالشده را بررسی کرده و در صورت معتبر بودن اطلاعات، شماره تلفن را ذخیره و کاربر را به لیست شمارهها هدایت میکند.
- حذف شماره تلفن (Delete) : اکشن GET شماره تلفن را بازیابی میکند. اکشن POST آن عملیات حذف را نهایی میکند و کاربر را به صفحه مربوطه برمیگرداند.
اجزای استفاده شده
- سرویس IPhoneService: مدیریت دادههای شماره تلفن.
- سرویس IStudentService: دسترسی به دادههای دانشجویان.
- سرویس IEnumService: ارائه مقادیر Enum مانند نوع شماره تلفن.
/// <summary>
/// کنترلر برای مدیریت عملیات مربوط به تلفنها
/// </summary>
public class PhoneController : Controller
{
private readonly IPhoneService _phoneService;
private readonly IStudentService _studentService;
private readonly IEnumService _enumService;
/// <summary>
/// سازنده کنترلر تلفن
/// </summary>
/// <param name="phoneService">سرویس تلفن</param>
/// <param name="studentService">سرویس دانشجو</param>
/// <param name="enumService">سرویس مقادیر شمارشی</param>
public PhoneController(
IPhoneService phoneService,
IStudentService studentService,
IEnumService enumService)
{
_phoneService = phoneService;
_studentService = studentService;
_enumService = enumService;
}
/// <summary>
/// نمایش لیست تلفنهای دانشجو
/// </summary>
/// <param name="StudentId">شناسه دانشجو</param>
/// <returns>نمایش لیست تلفنها</returns>
public async Task<IActionResult> Index(int StudentId)
{
ViewBag.StudentId = StudentId;
return View(await _phoneService.GetPhoneByStudentIdAsync(StudentId));
}
/// <summary>
/// نمایش فرم ایجاد تلفن جدید
/// </summary>
/// <param name="StudentId">شناسه دانشجو</param>
/// <returns>نمایش فرم ایجاد تلفن</returns>
public async Task<IActionResult> Create(int? StudentId)
{
if (StudentId == null)
return NotFound();
await _studentService.GetStudentByIdAsync(StudentId.Value);
ViewBag.PhoneType = _enumService.GetEnumList<PhoneType>();
return View();
}
/// <summary>
/// ایجاد تلفن جدید
/// </summary>
/// <param name="phone">مدل نمایشی تلفن</param>
/// <returns>نتیجه عملیات ایجاد تلفن</returns>
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,PhoneType,PhoneNumber,StudentId")] PhoneViewModel phone)
{
if (ModelState.IsValid)
{
await _phoneService.CreatePhoneAsync(phone);
return RedirectToAction(nameof(Index), new { StudentId = phone.StudentId });
}
ViewBag.PhoneType = _enumService.GetEnumList<PhoneType>();
return View(phone);
}
/// <summary>
/// نمایش فرم حذف تلفن
/// </summary>
/// <param name="id">شناسه تلفن</param>
/// <returns>نمایش فرم حذف تلفن</returns>
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
return NotFound();
return View(await _phoneService.GetPhoneByIdAsync(id.Value));
}
/// <summary>
/// حذف تلفن
/// </summary>
/// <param name="id">شناسه تلفن</param>
/// <returns>نتیجه عملیات حذف تلفن</returns>
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var StudentId = await _phoneService.DeletePhoneAsync(id);
return RedirectToAction(nameof(Index), new { StudentId = StudentId });
}
}نکته مهم در نمایش Enum ها
در فیلم آموزشی در ویو Details مربوط به کنترلر Student. نمایش اتربیوت Display فراموش شده. منظور نمایش مقدار فارسی Enum ها میباشد. کافی است به جای استفاده از item.PhoneType از Html.DisplayFor(e=>item.PhoneType) استفاده کنید. مانند کد زیر.
- استفاده از item.PhoneType
- استفاده از Html.DisplayFor(e=>item.PhoneType)
@foreach (var item in Model.Phones)
{
<dt class="col-sm-2">
@Html.DisplayFor(e => item.PhoneType)
</dt>
<dd class="col-sm-10">
@item.PhoneNumber
</dd>
}
































ممنون از توضیحات کاملت، یچیزی رو بدون رودرواسی بگم تو اینترنت میتونم کد پیدا کنم ولی تا وقتی اموزش هات رو قبلش ندیده باشم برام خیلی مبهمه یه کپی و پیست میکنم کارم راه میافته ولی اینکه بدونم چرا استفاده میکنم برام مهمتره ،واقعا دارم از تهران ای تی استفاده میکنم،و واقعا به هر کی که بخواد برنامه نویسی یاد بگیره شما رو پیشنهاد میدم چون دارم حال میکنم با برنامه نویسی ،انشاا.. همیشه موفق و پر انرژی باشی.
مرسی دوست عزیز از انرژی +++ شما ❤️❤️❤️
سلام جناب احدیان
ممنون از آموزش های فوق العاده تون
من متوجه نشدم که تگ هلپرهای از نوع asp مثل asp-for یا asp-item یا حتی مواردی که خودمون توی ویوها نوشتیم مثل asp-for-StudentId از کجا میان؟ یا بهتره بپرسم سیستم اینا رو از کجا میخونه و میشناسه؟ کلا چندتا از این تگ ها هست و...
متاسفانه هنوز درک درستی از اینها پیدانکردم. میشه توضیح بدید یا مرجعی رو برای مطالعه معرفی کنید؟
مرسی دوست عزیز از انرژی +++ شما ❤️❤️❤️
این آموزش را ببینید برای دوره Asp.net Core ما هست. در این ویدیو به پاسخ های شما جواب داده شده.
<a href="https://tehranit.net/tag-helper/" rel="ugc">آموزش TAG Helper در ASP.NET CORE</a>
بسیار عالی بود. سپاس
ضمنا من یه نگاه اجمالی هم به کل تگ های html انداختم و دیدم
۳۱ نوع تگ هلپر asp وجود داره و برای برخی از تگ های html اختصاص داده شده است
و هر تگ برخی از این کد هلپرها رو پشتیبانی می کنه:
(۸)form(10) - input(10) - a(11) - button(9) - lable(1) - div(1) - img(1) - link(8) - span(1) - textarea(1) - select(2) - script
سلام برای نمایش نام دانشجو در ستون
studentId
چکار باید کرد؟
در phoneVM
چرا نویگیشن پراپرتی
student
رو اضافه نکردید وقتی اضافه میکنمش قبول نمیکمه
public required Student Student { get; set; }
این شکلی هم برای
phoneprofile
امتحان مکینم ایراد داره
CreateMap().
ForMember(des => des.StudentId,
op => op.MapFrom(src => src.Student.Name.ToString()))
.ReverseMap();
چیزی که متوجه شدم اینه که نباید داخل ویو مدل ها از انتیتی ها استفاده کنیم باید از ویو مدل ها استفاده کنیم.
public StudentCardVM? StudentCard { get; set; }
public ICollection? Phones { get; set; }
پس داخل ویومدل phoneVM میتونیم
public required StudentVM Student { get; set; } یا
public string? StudentName { get; set;
و در فایل PhoneProfile
CreateMap().
ForMember(des => des.StudentName,
op => op.MapFrom(src => src.Student.Name+" " +src.Student.Family ))
.ReverseMap();
سلام وقت بخیر زمان ایجاد ویو برای اکشن Index این خطا رو میده ممنون میشم راهنمایی کنید.
:There was an error running the selected code generator
'Unable to resolve service for type
'Microsoft.EntityFrameworkCore.DbcontextOptions'1
[EFCoreTraining.Models.DatabaseContext.MyDbContext]
'while attempting to Active 'EFCoreTraining.Models.DatabaseContext.MyDbContext'.'