Я создаю свое первое веб-приложение с бритвенными страницами .net core.
Я пытаюсь переместить свое меню в частичное, чтобы я мог повторно использовать его по своему усмотрению, но, должно быть, я делаю что-то не так.
Ошибка:
The model item passed into the ViewDataDictionary is of type 'BrambiShop.UI.Pages.IndexModel', but this ViewDataDictionary instance requires a model item of type 'BrambiShop.UI.Pages.Shared._SideCategoriesMenuModel'.
Я знаю, что есть несколько тем по этому поводу, но я борюсь с этим через несколько дней после работы и не могу найти точного решения. Наверное, я понимаю, что я делаю неправильно. Но я не знаю, как сделать это правильно.
Я пытаюсь загрузить частичное из индекса следующим образом:
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
@{ await Html.RenderPartialAsync("_SideCategoriesMenu"); }
Частичное это:
@page
@model BrambiShop.UI.Pages.Shared._SideCategoriesMenuModel
@*
For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
*@
@foreach (var category in Model.Categories)
{
<button class = "font-weight-bold" data-toggle = "collapse" href = "#[email protected](modelItem => category.Id)"
aria-expanded = "false" aria-controls = "[email protected](modelItem => category.Id)">
@Html.DisplayFor(modelItem => category.Name)
</button>
<!-- Collapsible element -->
<div class = "collapse text-center" id = "[email protected](modelItem => category.Id)">
@foreach (var subCategory in Model.SubCategories.Where(x => x.CategoryId == category.Id))
{
<form action = "/url/to/action" Method = "GET">
<input type = "hidden" name = "Property" value = "@Html.DisplayFor(modelItem => subCategory.Id)" />
<button type = "submit">
<i class = "fas fa-caret-right pl-1"></i>@Html.DisplayFor(modelItem => subCategory.Name)
</button>
</form>
}
</div>
<!-- / Collapsible element -->
}
И, наконец, cshtml.cs
using BrambiShop.API.Models;
using BrambiShop.UI.Services;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace BrambiShop.UI.Pages.Shared
{
public class _SideCategoriesMenuModel : PageModel
{
private readonly IApiClient _Client;
public _SideCategoriesMenuModel(IApiClient client)
{
_Client = client;
}
public IList<Category> Categories { get; set; }
public IList<SubCategory> SubCategories { get; set; }
public async Task OnGet()
{
Categories = await _Client.GetCategoriesAsync();
SubCategories = await _Client.GetSubCategoriesAsync();
}
}
}
Может кто-нибудь помочь мне с этим, пожалуйста? Я просмотрел около 10 часов руководств по созданию API и основам Интернета, но это чертовски частично. Я просто нигде не могу найти ответ на этот вопрос.
Большое спасибо за любые усилия.
РЕДАКТИРОВАТЬ --- модель индекса
using BrambiShop.API.Models;
using BrambiShop.UI.Services;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace BrambiShop.UI.Pages
{
public class IndexModel : PageModel
{
public IndexModel()
{
}
public async Task OnGet()
{
}
}
}





Модель, которую вы используете для создания страницы, должна содержать полную модель меню. Затем вам нужно передать модель в RenderPartial.
IE:
@{ await Html.RenderPartialAsync("_SideCategoriesMenu", Model.SideMenu); }
Редактировать--
Добавьте свойство SideMenu в свою модель, чтобы вы могли получить к нему доступ на странице в приведенном выше примере.
using BrambiShop.API.Models;
using BrambiShop.UI.Services;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace BrambiShop.UI.Pages
{
public class IndexModel : PageModel
{
public IndexModel()
{
}
public SideMenuModel SideMenu { get; set;}
public async Task OnGet()
{
}
}
}
это будет свойство вашей «IndexModel».
Я просто не понимаю, извините, что прошу вас об этом, никогда этого не делал, но я добавил index.cshtml.cs в OP, не могли бы вы показать мне, что вы имеете в виду? Я потратил на эту проблему так много часов, что я в отчаянии.
В представлении Index есть модель типа IndexModel. Когда вы ставите эту строку
@{ await Html.RenderPartialAsync("_SideCategoriesMenu"); }
Та же модель будет передана _SideCategoriesMenu, то есть IndexModel. Вот почему вы получаете исключение, потому что модель, переданная в _SideCategoriesMenu, отличается от ожидаемой BrambiShop.UI.Pages.Shared._SideCategoriesMenuModel.
Чтобы обойти это, вы должны указать модель в методе RenderPartialAsync. бывший:
@{ await Html.RenderPartialAsync("_SideCategoriesMenu",YOUR_MODEL_HERE); }
Вы можете заменить YOUR_MODEL_HERE любым экземпляром типа _SideCategoriesMenuModel. Вы можете иметь его как собственность внутри IndexModel. бывший:
public class IndexModel : PageModel
{
public IndexModel()
{
}
public SideMenuModel SideMenu { get; set;}
public BrambiShop.UI.Pages.Shared._SideCategoriesMenuModel SideMenuModel{ get; set;}
public async Task OnGet()
{
}
}
}
А затем используйте его в своем индексном представлении
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
@{ await Html.RenderPartialAsync("_SideCategoriesMenu",Model.SideMenuModel); }
Извините, но откуда взяться «Model.SideMenu»?