Элемент модели, переданный в, имеет тип 'LoginModel', но для этого экземпляра требуется элемент модели типа 'HomeViewModel' - PullRequest
0 голосов
/ 27 октября 2019

Полный текст ошибки, которую я получаю

Произошло необработанное исключение при обработке запроса. InvalidOperationException: элемент модели, передаваемый в ViewDataDictionary, имеет тип 'FashionNova.Web.Areas.Identity.Pages.Account.LoginModel', но для этого экземпляра ViewDataDictionary требуется элемент модели типа 'FashionNova.Web.ViewModels.HomeViewModel'.

Это мой HomeController

namespace FashionNova.Web.Controllers
{
    using FashionNova.Services;
    using FashionNova.Web.ViewModels;
    using Microsoft.AspNetCore.Mvc;

    public class HomeController : BaseController
    {
        private readonly IMainCategoryService mainCategoryService;

        public HomeController(IMainCategoryService mainCategoryService)
        {
            this.mainCategoryService = mainCategoryService;
        }

        public IActionResult Index(HomeViewModel model)
        {
            var categoriesViewModel = this.mainCategoryService
                .GetAllMainCategories<HomeMainCategoryViewModel>();

            model.AllCategoriesViewModel = categoriesViewModel;

            return this.View(model);
        }

        public IActionResult Privacy()
        {
            return this.View();
        }

        public IActionResult About()
        {
            return this.View();
        }

        public IActionResult Contact()
        {
            return this.View();
        }

        public IActionResult Test()
        {
            return this.View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error() => this.View();
    }
}

Это мой макет

@using FashionNova.Data.Models
@using Microsoft.AspNetCore.Identity

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager


<!DOCTYPE html>
<html lang="en">
<head>
    <title>@ViewData["Title"]</title>
    <meta name="description" content="Fashion Nova is the top online fashion store for women & men. Shop sexy club dresses, jeans, shoes, bodysuits, skirts & more. Cheap & affordable fashion online">
    <!-- Favicon -->
    <link rel="icon" type="image/x-icon" href="images/icons/favicon.ico">
    <!-- Plugins CSS File -->
    <link rel="stylesheet" href="~/css/bootstrap.min.css">
    <!-- Main CSS File -->
    <link rel="stylesheet" href="~/css/style.min.css">
</head>
<body>
<div class="page-wrapper">
    <header class="header">
        <partial name="Partials/_HeaderTopPartial"/>
        <div class="header-middle sticky-header">
            <div class="container">
                <div class="header-left">
                    <ul class="menu sf-arrows">
                        <li class="active">
                            <a asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                        </li>
                        <partial name="Partials/NavigationPartials/_NavigationHeaderLeftCategoryPartial"/>
                        <partial name="Partials/NavigationPartials/_NavigationHeaderLeftProductsPartial"/>
                        <partial name="Partials/NavigationPartials/_NavigationHeaderLeftPagesPartial"/>
                    </ul>
                </div>
                <partial name="Partials/NavigationPartials/_NavigationHeaderCenterPartial"/>
                <div class="header-right">
                    <partial name="Partials/NavigationPartials/_NavigationHeaderRightPartial"/>
                </div><!-- End .header-right -->
            </div><!-- End .container -->
        </div><!-- End .header-middle -->
    </header><!-- End .header -->

    <main class="main">
        @this.RenderBody()
    </main>
    <partial name="Partials/_FooterPartial"/>
</div>

<div class="mobile-menu-overlay"></div>
<div class="mobile-menu-container">
    <partial name="Partials/_MobileMenuPartial"/>
</div>

<a id="scroll-top" href="#top" title="Top" role="button">
    <i class="icon-angle-up"></i>
</a>

<script src="~/js/jquery.min.js"></script>
<script src="~/js/bootstrap.bundle.min.js"></script>
<script src="~/js/plugins.min.js"></script>
<script src="~/js/main.min.js"></script>
@this.RenderSection("Scripts", required: false)
</body>
</html>

Все работает нормально, пока я не попытаюсь передать модель ЛЮБОМУ партиалов вмакет, будь то частичный нижний колонтитул, частичный заголовок, частичный элемент навигации.

Я передаю HomeViewModel в часть категорий частичного элемента навигации, поэтому я не связываюсь с другими частями навигации

@model HomeViewModel
<li>
    <a href="category.html" class="sf-with-ul">Categories</a>
    <div class="megamenu megamenu-fixed-width">
        <div class="row">
            <div class="col-lg-8">
                <div class="row">
                    <div class="col-lg-6">
                        <div class="menu-title">
                            <a href="#">Variations 1<span class="tip tip-new">New!</span></a>
                        </div>
                        <ul>
                            <li>
                                <a href="category-banner-full-width.html">Fullwidth Banner<span class="tip tip-hot">Hot!</span></a>
                            </li>
                            <li>
                                <a href="category-banner-boxed-slider.html">Boxed Slider Banner</a>
                            </li>
                            <li>
                                <a href="category-banner-boxed-image.html">Boxed Image Banner</a>
                            </li>
                            <li>
                                <a href="category-sidebar-left.html">Left Sidebar</a>
                            </li>
                            <li>
                                <a href="category-sidebar-right.html">Right Sidebar</a>
                            </li>
                            <li>
                                <a href="category-flex-grid.html">Product Flex Grid</a>
                            </li>
                            <li>
                                <a href="category-horizontal-filter1.html">Horizontal Filter1</a>
                            </li>
                            <li>
                                <a href="category-horizontal-filter2.html">Horizontal Filter2</a>
                            </li>
                        </ul>
                    </div><!-- End .col-lg-6 -->
                    <div class="col-lg-6">
                        <div class="menu-title">
                            <a href="#">Variations 2</a>
                        </div>
                        <ul>
                            <li>
                                <a href="#">Product List Item Types</a>
                            </li>
                            <li>
                                <a href="category-infinite-scroll.html">Ajax Infinite Scroll</a>
                            </li>
                            <li>
                                <a href="category-3col.html">3 Columns Products</a>
                            </li>
                            <li>
                                <a href="category-4col.html">4 Columns Products <span class="tip tip-new">New</span></a>
                            </li>
                            <li>
                                <a href="category-5col.html">5 Columns Products</a>
                            </li>
                            <li>
                                <a href="category-6col.html">6 Columns Products</a>
                            </li>
                            <li>
                                <a href="category-7col.html">7 Columns Products</a>
                            </li>
                            <li>
                                <a href="category-8col.html">8 Columns Products</a>
                            </li>
                        </ul>
                    </div><!-- End .col-lg-6 -->
                </div><!-- End .row -->
            </div><!-- End .col-lg-8 -->
            <div class="col-lg-4">
                <div class="banner">
                    <a href="#">
                        <img src="~/images/menu-banner-2.jpg" alt="Menu banner">
                    </a>
                </div><!-- End .banner -->
            </div><!-- End .col-lg-4 -->
        </div>
    </div><!-- End .megamenu -->
</li>

Мой loginPartial содержится в другой части навигационной части, я попытался разделить их, чтобы неверная модель не прошла, но даже после этого - та же проблема возвращается.

<li>
    <a href="#" class="sf-with-ul">Pages</a>
    <ul>
        <li>
            <a href="cart.html">Shopping Cart</a>
        </li>
        <li>
            <a href="#">Checkout</a>
            <ul>
                <li>
                    <a href="checkout-shipping.html">Checkout Shipping</a>
                </li>
                <li>
                    <a href="checkout-shipping-2.html">Checkout Shipping 2</a>
                </li>
                <li>
                    <a href="checkout-review.html">Checkout Review</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">Dashboard</a>
            <ul>
                <li>
                    <a href="dashboard.html">Dashboard</a>
                </li>
                <li>
                    <a href="my-account.html">My Account</a>
                </li>
            </ul>
        </li>
        <li>
            <a asp-area="" asp-controller="Home" asp-action="About">About Us</a>
        </li>
        <li>
            <a href="#">Blog</a>
            <ul>
                <li>
                    <a href="blog.html">Blog</a>
                </li>
                <li>
                    <a href="single.html">Blog Post</a>
                </li>
            </ul>
        </li>
        <li>
            <a asp-area="" asp-controller="Home" asp-action="Contact">Contact Us</a>
        </li>
        <li>
            <partial name="_LoginPartial"/>
        </li>
        <li>
            <a a asp-area="Identity" asp-page="/Account/ForgotPassword">Forgot Password</a>
        </li>
    </ul>
</li>

Я передаю HomeViewModel в Index, потому что хочу загрузить все категории, продукты и 2 ряда продуктов во внешнем интерфейсе. т, но когда я это делаю - логин не работает.

1 Ответ

0 голосов
/ 28 октября 2019

Ваше частичное представление ожидает модель типа HomeViewModel, но вы не указали ее при обращении к частичному представлению из своего _Layout.cshtml, поэтому страница по умолчанию отправляет родительскую модель в ваше частичное представление, что вызывает ошибку, которую вы

Вам нужно передать ожидаемую модель, как показано ниже:

@await Html.PartialAsync("_myPartial",new HomeViewModel())

ОБНОВЛЕНИЕ:

Если вы хотите передать данные в частичноепосмотрите в _Layout.cshtml, вот пример демонстрации, как показано ниже:

1._Layout.cshtml:

@await Html.PartialAsync("_myPartial",new HomeViewModel() { Id=1,Name="aa"})

2._myPartial.cshtml:

@model HomeViewModel
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Id)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
        </tr>
    </thead>
    <tbody>            
        <tr>
            <td>
                @Html.DisplayFor(model => model.Id)
            </td>
            <td>
                @Html.DisplayFor(model => model.Name)
            </td>
        </tr>            
    </tbody>
</table>
...