【问题标题】:Html.RenderAction causes "No route in the route table matches the supplied values"Html.RenderAction 导致“路由表中没有路由与提供的值匹配”
【发布时间】:2010-02-22 13:47:50
【问题描述】:

我正在尝试以这种方式在 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");%>

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

【问题讨论】:

    标签: .net asp.net-mvc


    【解决方案1】:

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

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

    【讨论】:

    • Memet - 你能告诉我这个解决方案是否很好,它不会影响到任何其他地方吗? -- 这确实解决了我的问题
    【解决方案2】:

    MVC 期货用于允许渲染没有路由的动作。这在 ASP.NET MVC2 中有所改变。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      这是假设您没有更改默认路由,也没有添加会影响您的路由的新路由

      【讨论】:

      • 我发现了问题。我总是删除 {controller}/{action} 路由并使用小写 REST (如 URL)自定义我的所有路由。但是对于 Html.RenderAction 来说,有这样的通用路线是很有必要的。我将一般路线添加到路线列表的末尾,并且有效。
      • 哇!我花了几个小时才弄清楚为什么我会收到此问题标题中所述的错误消息。这里的评论帮助我解决了它!谢谢!
      • 我使用 AttributeRouting 项目,如果有办法取消默认路由但仍然让 RenderAction 正常工作,那就太好了!否则我偶尔会被一个错误输入的 ActionLink 帮助程序烧伤,导致基于默认值的错误 URL,我真的希望有一个例外!
      【解决方案4】:

      我有同样的错误。它是由更改默认路由引起的;显然它显式搜索路由名称“默认”。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我发现了问题。我总是删除 {controller}/{action} 路由并使用小写 REST (如 URL)自定义我的所有路由。但是对于 Html.RenderAction 来说,有这样的通用路线是很有必要的。我将一般路线添加到路线列表的末尾,并且有效。
        【解决方案6】:

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

        试试这个:

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

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

        【讨论】:

        【解决方案7】:

        我之前也遇到过这个问题,就是路由没有包含控制器。

                    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 }
                );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          • 2019-02-03
          • 1970-01-01
          相关资源
          最近更新 更多