ویوهای داینامیک برای روابط یک به چند در 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
ویوهای داینامیک برای روابط یک به چند در EF Core

ویو داینامیک برای روابط One To Many در EF Core

  • استفاده از Html.DisplayFor(e=>item.PhoneType)
ویوهای داینامیک برای روابط یک به چند در EF Core

ویوه داینامیک برای روابط One To Many در EF Core

@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>
}

مشاهده در آپارات یا یوتیوب

محتوای ویدیویی این صفحه در سایت قابل مشاهده است. اما اگر عادت دارید توی پلتفرم آپارات یا یوتیوب ویدیوها را مشاهده کنید، می‌توانید از دکمه‌های زیر استفاده کنید.

تماشای ویدیوی ویوهای داینامیک برای روابط یک به چند در EF Core در آپارات و یوتیوب

اشتراک‌گذاری با یک کلیک

با یک کلیک، محتوای این صفحه را در شبکه‌های اجتماعی، ایمیل یا پیام‌رسان‌های مورد علاقه‌تان به‌سرعت به اشتراک بگذارید.

اشتراک‌گذاری صفحه ویوهای داینامیک برای روابط یک به چند در EF Core در شبکه‌های اجتماعی

نظرات ارزشمند شما

نظرات شما برای ما ارزشمند است و آنها را میخوانیم و پاسخ میدهیم.

تصویر مرتضی فاضل

ممنون از توضیحات کاملت، یچیزی رو بدون رودرواسی بگم تو اینترنت میتونم کد پیدا کنم ولی تا وقتی اموزش هات رو قبلش ندیده باشم برام خیلی مبهمه یه کپی و پیست میکنم کارم راه میافته ولی اینکه بدونم چرا استفاده میکنم برام مهمتره ،واقعا دارم از تهران ای تی استفاده میکنم،و واقعا به هر کی که بخواد برنامه نویسی یاد بگیره شما رو پیشنهاد میدم چون دارم حال میکنم با برنامه نویسی ،انشاا.. همیشه موفق و پر انرژی باشی.

تصویر محمدرضا احدیان

مرسی دوست عزیز از انرژی +++ شما ❤️❤️❤️

تصویر رضا فلاح

سلام جناب احدیان
ممنون از آموزش های فوق العاده تون
من متوجه نشدم که تگ هلپرهای از نوع 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

تصویر alamir

سلام برای نمایش نام دانشجو در ستون
studentId
چکار باید کرد؟
در phoneVM
چرا نویگیشن پراپرتی
student
رو اضافه نکردید وقتی اضافه میکنمش قبول نمیکمه
public required Student Student { get; set; }
این شکلی هم برای
phoneprofile
امتحان مکینم ایراد داره
CreateMap().
ForMember(des => des.StudentId,
op => op.MapFrom(src => src.Student.Name.ToString()))
.ReverseMap();

تصویر alamir

چیزی که متوجه شدم اینه که نباید داخل ویو مدل ها از انتیتی ها استفاده کنیم باید از ویو مدل ها استفاده کنیم.
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'.'

فرم افزودن دیدگاه

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

با خدمات تهران آی تی آشنا شوید

تهران آی تی با افتخار خدمات زیر را ارائه می‌دهد.