剃刀局部视图错误 [英] Razor Partial View Error

查看:78
本文介绍了剃刀局部视图错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在跟踪在(但我一直使用Razor代替ASPX).

I'm following the example website being built in Pro ASP.NET MVC 2 Framework (but using Razor instead of ASPX as I go along).

但是,我遇到了一些偏见.我收到以下错误:

However, I've hit a snag with a partial view. I'm getting the following error:

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 (视图模型类):

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局部视图而不是剃刀局部视图时,以下工作正常:

The following works fine when I use an ASCX Partial View, instead of a razor partial view:

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

推荐答案

您要使用RenderAction而不是RenderPartial,因为RenderPartial会复制用于当前正在加载的任何其他视图的当前模型的副本,并将其发送到您的视图(并且永远不会执行您的控制器方法).IE RenderPartial不会调用您的方法..仅调用您的视图.RenderAction将调用您的控制器方法,然后调用局部视图.

You want to use RenderAction and not RenderPartial as RenderPartial makes a copy of the current model used for whatever other view you are currently loading and sends it over to your view (and never executes your controller method). IE RenderPartial does not call your method .. only your view. RenderAction will call your controller method and then the partial view.

在您看来,使用:


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

您的路线很简单(假设导航栏一般且没有参数)

Your route is simply (assuming a general nav bar and no parameters)


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

这篇关于剃刀局部视图错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆