_layout中的RenderAction给出“路由表中没有路由与提供的值匹配”。

时间:2014-01-14 10:11:43

标签: asp.net-mvc asp.net-mvc-4

在我的_layout.cshtml上,我有以下一行

Html.RenderAction("ChamberComment", "Carnets", new { Area = "Chamber"});

这会出现以下错误:

  

路由表中没有路由与提供的值匹配。

我正在使用routedebugger,所以在显示此错误的页面下,我实际上可以看到找到的匹配路由:

enter image description here

我使用AttributeRouting定义了这条路线:

namespace MyProject.Net.Site.Areas.Chamber.Controllers
{
    [RouteArea("Chamber", AreaPrefix = "")]
    [AuthorizeRoles(Roles = RoleDiscriminator.Chamber)]
    public class CarnetsController : BaseController
    {
        [HttpGet]
        [Route("chamber/carnets/{slug}/{step}/chamberRemarks")]
        public ActionResult ChamberComment(string slug, string step)
        {

我也可以直接访问网址

http://myproject/chamber/carnets/18-reffr/general/chamberRemarks

并在浏览器中呈现部分,并在预期的RouteDebugger信息下面...

因此,在_layout主页中使用时,系统无法将RenderAction语句转换为正确的操作,但它能够将指定的URL路由到此操作。

我知道应该朝哪个方向看?

2 个答案:

答案 0 :(得分:2)

如果您在顶级控制器中有子操作并尝试从布局中渲染它,则会出现相关问题。就我而言,这发生在一个有区域的项目中。我不确定它是否也出现在没有区域的项目中。

我有一个默认路由应该满足[Render] Action参数。但是,这种情况总是失败:

Html.Action("ActionName", "ControllerName")

解决方案是添加一个空区域:

Html.Action("ActionName", "ControllerName", new { area = "" })

现在,不再出现异常并呈现局部视图。

答案 1 :(得分:1)

您是否尝试过提供slug和step参数,如下所示:

 Html.RenderAction("ChamberComment", "Carnets", new { Area = "Chamber", slug = "18-reffr", step = "general"});

如果这些参数不在当前正在呈现的Url中,则需要手动将它们传递给Html.RenderAction方法。

根据你的评论,slug可以在当前的Url中找到,但是步骤是硬编码的,所以你需要将它提供给帮助者。