ASP.net MVC RenderAction和Route

时间:2011-04-23 05:34:55

标签: asp.net-mvc-3

我有一个使用ASP.net MVC3的网络项目。我的项目中有一个子动作。我用

<% Html.RenderAction("Navigator", "Application");%>

调用共享操作。但是我发现如果我当前的url是“localhost / application”,它会抛出异常“路由表中没有路由匹配提供的值”。但是当当前url是“localhost / application / index”时,它工作正常。索引是我的路由配置中的默认操作,如下所示:

    public static void RegisterRoutesTo(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
        //routes.IgnoreRoute("{*chartName}", new { chartName = @"(.*)?Chart.aspx" }); //ignore request for charting request
        routes.Ignore("{*pathInfo}", new { pathInfo = @"^.*(ChartImg.axd)$" });

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{id}/{action}",                          // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },  // Parameter defaults
            new { httpMethod = new HttpMethodConstraint("GET", "POST") }   // Allowed http methods
        );
    }

请注意,我切换默认ID和操作位置。我看到mvc在使用“Html.ActionLink(...)”时可以删除url中的默认控制器和动作名称。而且我不喜欢在我的视图中使用显式的url字符串。怎么能让它发挥作用?

我的行动代码很简单:

    [ChildActionOnly]
    public ActionResult Navigator()
    {
        return PartialView(appFacility.GetAll());
    }

非常感谢。

2 个答案:

答案 0 :(得分:1)

光学参数仅在路线末端正常工作。尝试这样的事情:

routes.MapRoute("DefaultWithID", "{controller}/{id}/{action}",
    new { action = "Index" },
    new { id = "^[0-9]+$" }
);

routes.MapRoute("Default", "{controller}/{action}",
    new { controller = "Home", action = "Index" }
);

编辑:希望修复:)这个版本依赖于ID将是数字的事实 - 没有约束我们无法判断它是否意味着动作或id,所以当指定ID时路线上不能有默认动作< / p>

答案 1 :(得分:1)

错误的路由URL定义和默认组合

问题是在可选参数之后不能有非可选参数。

为什么localhost/application/index有效?这是路线值:

  • controller = "application"(从网址提供)
  • id = "index"(从网址提供)
  • action = "Index"(作为路由默认提供)

这些值基本上等于localhost/application/index/index请求网址。

如果您希望RenderAction能够正常工作,则必须这样称呼它:

<% Html.RenderAction("Navigator", "Application", new { id = 0 }); %>

等于localhost/application/0/navigator请求网址。

但是你很快就会发现你的路线不起作用,你必须改变它(因为我想你不喜欢在你的URL中增加0)。如果您提供有关您的路线工作的信息(或者您决定切换actionid的原因),我们可以提供有助于您满足要求的答案。