نحوه ارسال Model به ViewComponent در Asp.net Core
سلام دوستان
یک ViewComponent دارم که میخوام اطلاعات این ViewComponent رو از طریق Model موجود در Viewی اصلی بهش ارسال کنم.
ویو به صورت زیر هست :
@model IEnumerable<CourseListForDisplayViewModel>
<div class="content">
<form>
<div class="panel panel-body">
</div>
</form>
@await Component.InvokeAsync("myViewComponent", Model)
</div>
در کنترلر هم دستورات زیر رو دارم
public IActionResult Index()
{
var model = _icourse.CourseListForDisplay();
return View(model);
}
و در کلاس مربوط به Component هم دستورات زیر رو دارم
[ViewComponent(Name = "myComponent")]
public class CourseListViewComponent : ViewComponent
{
private readonly ICourseRepository _icourse;
public CourseListViewComponent(ICourseRepository icourse)
{
_icourse = icourse;
}
public IViewComponentResult Invoke(CourseListForDisplayViewModel model)
{
return View(model);
}
}
اما بعد از اجرای پروژه با خطای زیر روبرو میشم
Unable to cast object of type 'System.Collections.Generic.List`1[porseman.Models.ViewModels.CourseListForDisplayViewModel]' to type 'porseman.Models.ViewModels.CourseListForDisplayViewModel'
لطفا راهنمایی کنید که چجوری باید این خطا رو رفع کنم.
پاسخ هوش مصنوعی
مسیله ی شما به دلیل نوع داده ای که به ViewComponent ارسال می کنید به وجود آمده است. شما در حال ارسال یک مجموعه (IEnumerable) از نوع CourseListForDisplayViewModel
به ViewComponent هستید، در حالی که متد Invoke
انتظار یک شیء از نوع CourseListForDisplayViewModel
را دارد.
برای رفع این مشکل، کافی است که متد Invoke
در CourseListViewComponent
را به گونه ای تغییر دهید که بتواند یک IEnumerable
را دریافت کند. به این صورت:
[ViewComponent(Name = "myComponent")]
public class CourseListViewComponent : ViewComponent
{
private readonly ICourseRepository _icourse;
public CourseListViewComponent(ICourseRepository icourse)
{
_icourse = icourse;
}
public IViewComponentResult Invoke(IEnumerable model)
{
return View(model);
}
}
سپس در ویو خود، می توانید به سادگی همین Model
را به ViewComponent ارسال کنید که در حال حاضر در حال انجام آن هستید:
@await Component.InvokeAsync("myViewComponent", Model)
این تغییرات باید مشکل شما را حل کند. حالا می توانید برنامه ی خود را اجرا کنید و دیگر با خطای نوع داده مواجه نخواهید شد.
نحوه ارسال Model به ViewComponent در Asp.net Core
دستوراتی که شما نوشتید تا حد زیادی درست هست اما اشکالاتی داره. اول اینکه بهتره که به Model که میخواید ارسال کنید یه اسم بدید و در کلاس مربوط به Component هم با همون نام دریافتش کنید. کدهای زیر رو دقت کنید :
@model IEnumerable<CourseListForDisplayViewModel>
<div class="content">
<form>
<div class="panel panel-body">
</div>
</form>
@await Component.InvokeAsync("myViewComponent", new {mModel = Model})
</div>
نکته بعد هم اینکه Model شما یک IEnumerable هست. بنابراین باید در کلاس مربوط به View Component هم یک IEnumerable دریافت کنید نه یک Model تنها. کدهای زیر رو دقت بفرمایید
[ViewComponent(Name = "myComponent")]
public class CourseListViewComponent : ViewComponent
{
private readonly ICourseRepository _icourse;
public CourseListViewComponent(ICourseRepository icourse)
{
_icourse = icourse;
}
public IViewComponentResult Invoke(IEnumerable<CourseListForDisplayViewModel> model)
{
return View(model);
}
}
بنظر نمیاد مشکل دیگه ای وجود داشته باشه.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- آپلود فایل در Asp.net core چگونه است؟
- حذف کامل یک رکورد در جدول ریلیشن شده
- اشکال در آپلود فایل ویدیو در mvc core 2