【问题标题】:Razor Partial View ErrorRazor 部分视图错误
【发布时间】:2011-05-04 03:49:08
【问题描述】:

我正在关注在 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; }
    }
}

编辑: 当我使用 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)%>
<% } %>

【问题讨论】:

  • 你有没有真正让这个为 Razor 工作?这是来自我猜的 Apress Pro MVC 2 Framework 书?我在尝试使用 Razor 时遇到了完全相同的问题,无论我做什么(甚至是 Adam Tuliper 的建议)我都没有运气!

标签: asp.net-mvc-3 razor partial-views


【解决方案1】:

您想使用 RenderAction 而不是 RenderPartial,因为 RenderPartial 会复制当前模型用于您当前加载的任何其他视图并将其发送到您的视图(并且从不执​​行您的控制器方法)。 IE RenderPartial 不会调用您的方法.. 只有您的视图。 RenderAction 将调用您的控制器方法,然后调用局部视图。

在您看来使用:

@Html.Action("菜单", "导航")

你的路线很简单(假设一个通用的导航栏并且没有参数)

路线.MapRoute( "NavMenu", // 路线名称 "Nav/Menu", // 带参数的 URL 新的{控制器=“导航”,动作=“菜单”} );

【讨论】:

  • 谢谢。如果我更新上述代码以使用 RenderAction,例如:@Html.RenderAction("Menu"),我会收到以下错误:“在控制器 'SportsStore.WebUI.Controllers.ProductsController' 上找不到公共操作方法 'Menu'。 "问题当然是 Menu() 函数在“NavController.cs”而不是“ProductsController.cs”
  • 你可以指定 RenderAction(action, controller) 所以 @Html.RenderAction("Menu", "NavController") (确保你也有到达这个的路线)
  • 好的,这很有意义,所以我将其更新为 @{ Html.RenderAction("Menu", "Nav"); },但我正在为这条路线而苦苦挣扎。我有: routes.MapRoute(null, "???", new{ Controller = "Nav", action = "Menu" });显然,我不知道该为字符串/路由放什么
  • 好的,所以我不能让它在剃须刀中工作,但它适用于 ASPX 局部视图。基本上,到处都是完全相同的代码,但 Menu.ascx(使用 webform 语法)可以正常工作。什么给了?
【解决方案2】:

尝试更新控制器中的 Menu 函数以返回 PartialView

public PartialViewResult Menu()
{
    .
    .
    return PartialView(NavLinks)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2011-06-29
    • 2011-03-23
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    相关资源
    最近更新 更多