Ошибка частичного просмотра бритвы - PullRequest
0 голосов
/ 04 мая 2011

Я слежу за примером веб-сайта, который создается в Pro ASP.NET MVC 2 Framework (но я использую вместо этого Razor вместо ASPX).

Однако яударил загвоздка с частичным видом.Я получаю следующую ошибку:

The model item passed into the dictionary is of type
'SportsStore.WebUI.Models.ProductsListViewModel', but this dictionary requires a model
item of type 'System.Collections.Generic.IEnumerable`1[SportsStore.WebUI.Models.NavLink]'.

Вот соответствующие файлы:

_Layout.cshtml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title</title>
    <link rel="stylesheet" href="@Url.Content("~/Content/global.css")" />
    <script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"><script>
</head>

<body>
    <header>
        <h1>SPORTS STORE</h1>
    </header>
    <nav class="categories">
        @{ Html.RenderAction("Menu", "Nav"); } // <!-- HERE IS THE PROBLEM -->
    </nav>
    <section id="content">
        @RenderBody()
    </section>
</body>
</html>

Menu.cshtml (частичное представление):

@model IEnumerable<SportsStore.WebUI.Models.NavLink>

@foreach (var link in Model)
{
    @Html.RouteLink(link.Text, link.RouteValues);
}

NavController.cs:

namespace SportsStore.WebUI.Controllers
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using SportsStore.Domain.Abstract;
    using SportsStore.WebUI.Models;


    public class NavController : Controller
    {
        private IProductsRepository productsRepository;


        public NavController(IProductsRepository productsRepository)
        {
            this.productsRepository = productsRepository;
        }


        public ViewResult Menu()
        {
            Func<string, NavLink> makeLink = categoryName => new NavLink
            {
                Text = categoryName ?? "Home",
                RouteValues = new System.Web.Routing.RouteValueDictionary(
                    new
                    {
                        controller = "Products",
                        action = "List",
                        category = categoryName,
                        page = 1
                    })
            };

            List<NavLink> navLinks = new List<NavLink>
            {
                makeLink(null)
            };

            var categories = productsRepository.Products.Select(x => x.Category);

            foreach(var categoryName in categories.Distinct().OrderBy(x => x))
                navLinks.Add(makeLink(categoryName));

            return View(navLinks);
        }
    }
}

NavLink.cs (класс View-Model):

namespace SportsStore.WebUI.Models
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Routing;


    public class NavLink
    {
        public string Text { get; set; }
        public RouteValueDictionary RouteValues { get; set; }
    }
}

EDIT: При использовании частичного просмотра ASCX вместо частичного просмотра бритвы работает следующее:

<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<SportsStore.WebUI.Models.NavLink>>" %>
<% foreach (var link in Model) { %>
    <%: Html.RouteLink(link.Text, link.RouteValues)%>
<% } %>

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Попробуйте обновить функцию меню в вашем контроллере, чтобы получить PartialView

public PartialViewResult Menu()
{
    .
    .
    return PartialView(NavLinks)
}
1 голос
/ 04 мая 2011

Вы хотите использовать RenderAction, а не RenderPartial, поскольку RenderPartial создает копию текущей модели, используемой для любого другого представления, которое вы в данный момент загружаете, и отправляет его на ваше представление (и никогда не выполняет метод контроллера).IE RenderPartial не вызывает ваш метод .. только ваше мнение.RenderAction вызовет ваш метод контроллера, а затем частичное представление.

По вашему мнению используйте:

@Html.Action("Menu", "Nav")

Ваш маршрут прост (при условии общей навигационной панели и без параметров)

            routes.MapRoute(
    "NavMenu", // Route name
    "Nav/Menu", // URL with parameters
    new { controller = "Nav", action = "Menu"}
);
...