PDA

View Full Version : نمایش دادهها در ویوی متعلق به ViewComponent



elham9
شنبه 02 تیر 1397, 18:00 عصر
سلام

من میخام یه ویوکامپوننت برای قسمت topmenu بنویسم ، مشکل من در قسمت ویو هست که چطور با استفاده از ویومدل، منوها را نمایش بدم . ممنون


public class TopMenuViewComponent : ViewComponent {
private readonly DataContext _dataContext;
public TopMenuViewComponent(DataContext dataContext)
{
_dataContext = dataContext;
}
public async Task<IViewComponentResult> InvokeAsync()
{
var qMenu = (from rows in _dataContext.Menus
select new MenuViewModel
{
Id = rows.Id,
Name = rows.Name,
URL = rows.URL
}).ToList();
return await Task.FromResult((IViewComponentResult)View("Default", qMenu));
}
}

و یک ویو مدل برای اون در نظر گرفتم :


public class MenuViewModel {
public int Id { get; set; }
public string Name { get; set; }
public string URL { get; set; }
public int ParentId { get; set; }


}

و در صفحه html بصورت زیر عمل کردم :


@model MenuViewModel

@foreach (var item in Model.Where(@item.ParentId == 0))
{


<li class="has-dropdown megamenu">
<a asp-area="" asp-controller=@item.Name asp-action=@item.Name>@item.Name</a>
</li>
}



در این صفحه هر کاری میکنم و هر کدی می نویسم نمیتونم با ویو مدل ارتباط رو برقرار کنم و خطا ی experssion دارم . ممنون

hakim22
شنبه 02 تیر 1397, 22:22 عصر
در Razor و یا همون فایلهای با پسوند cshtml وقتی درون حلقه هستید دیگه نیاز به استفاده از @ ندارید. از item در Foreach کاراکتر @ را حذف کنید.

elham9
شنبه 02 تیر 1397, 23:34 عصر
ممنون . ولی item رو نمیشناسه و ارور میده در این حالت .
مسیری رو که من رفتم درسته ؟ یعنی برای ویوکامپوننتها یک ویومدل درنظر بگیرم و در ویوکامپوننت دستورات لینک رو بنویسم و از ریپازیتوری در این حالت استفاده نشه ؟

hakim22
یک شنبه 03 تیر 1397, 00:38 صبح
@foreach (var item in Model.Where(m=>m.ParentId == 0))
{


<li class="has-dropdown megamenu">
<a asp-area="" asp-controller=@item.Name asp-action=@item.Name>@item.Name</a>
</li>
}

elham9
یک شنبه 03 تیر 1397, 07:26 صبح
ممنون . با این روش هم درست نشد این ارور رو میده و where رو در این حالت صحیح نمیدونه .


'MenuViewModel' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'MenuViewModel' could be found (are you missing a using directive or an assembly reference?)+

@foreach (var item in Model.Where(n => n.ParentId == 0))

hakim22
یک شنبه 03 تیر 1397, 09:57 صبح
خب شما باید Linq رو به ویو اضافه کنید.


@using System.Linq

elham9
یک شنبه 03 تیر 1397, 16:25 عصر
ممنون . اضافه کردم اما همچنان همون ارور ر میده . و این خط کد هم خاکستری هست (منظورم اینه که زمانیکه mvc به using احتیاج نداره اون رو به رنگ خاکستری در میاره )

بجای استفاده از @model menuviewmodel از کد زیر استفاده کردم :


@model IEnumerable<MenuViewModel>



توضیحاتش رو از داکیومنتها خوندم . اما درست توجیه نشدم . ممنون میشم توضیح بدین چرا باید به این روش کار کنیم ؟

hakim22
دوشنبه 04 تیر 1397, 01:44 صبح
وقتی لازمه در بین آیتم های یک آرایه گردش کنید (https://www.aparat.com/v/d3Ms1) باید از IEnumerable استفاده کنید.