Я слежу за примером веб-сайта, который создается в 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)%>
<% } %>