Html.RenderAction导致“路由表中没有路由匹配提供的值”

时间:2010-02-22 13:47:50

标签: .net asp.net-mvc

我正试图以这种方式在ASP.NET MVC 2 RC2中使用Html.RenderAction:

在菜单控制器中:

[ChildActionOnly]
public ActionResult ContentPageMenus()
{
     var menus = _contentPageMenuRepository.GetAll().WithCulture(CurrentCulture);
     return PartialView(menus);
}

在我的索引视图中(对于Home控制器的索引操作):

 <% Html.RenderAction("ContentPageMenus", "ContentPageMenu");%>

但我总是收到此错误消息: 路由表中的路由与提供的值不匹配。

7 个答案:

答案 0 :(得分:11)

MVC Futures用于允许呈现没有路线的动作。这在ASP.NET MVC2中已经发生了变化。

如果您希望RenderAction工作,并希望隐藏您的路线,以便无法公开访问。

  1. globals.asax.cs
  2. 中添加您的操作路线
  3. 使用[ChildActionOnly]属性装饰您的操作。

答案 1 :(得分:11)

添加像这样的第三个参数是我的解决方案(在剃须刀中):

@{Html.RenderAction("ActionName", "ControllerName", new { area = string.Empty });}

答案 2 :(得分:5)

你的控制器名称是什么? 默认情况下,您的路线会发生以下情况。

搜索RenderAction方法中指定的Controller名称,并在该名称后附加“Controller”。

调用Controller中的Action方法并返回View。

因此,通过查看您的代码,将发生以下情况

  1. 您应该有一个名为“ContentPageMenuController”的控制器
  2. 您应该有一个名为“ContentPageMenus”的动作
  3. 您应该有一个名为ContentPageMenus()
  4. 的视图

    这假设您没有更改默认路由并且没有添加会影响路由的新路由

答案 3 :(得分:4)

我有同样的错误。这是由改变默认路线引起的;显然它明确地搜索路线名称“默认”。

答案 4 :(得分:0)

您是否为申请注册了其他路线?

答案 5 :(得分:0)

为什么不尝试使用强类型方法?

试试这个:

<% Html.RenderAction<ContentPageMenusController>(x => x.ContentPageMenus()); %>

你必须填写班级的确切名称。

答案 6 :(得分:0)

之前我遇到过这个问题,路线并没有包含控制器。

            context.MapRoute(
            "Route_default",
            "Stuff/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
        );

我仍然希望能够在区域之后直接调用动作,所以我添加了以下路线。

            context.MapRoute(
            "Route_default",
            "Search/{action}/{id}",
        new { controller = "Search", action = "Index", id = UrlParameter.Optional }
        );

        context.MapRoute(
            "Route_Controller",
            "Stuff/{controller}/{action}/{id}",
            new { controller = "Something", action = "Index", id = UrlParameter.Optional }
        );