我有一个使用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());
}
非常感谢。
答案 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)
问题是在可选参数之后不能有非可选参数。
为什么localhost/application/index
有效?这是路线值:
"application"
(从网址提供)"index"
(从网址提供)"Index"
(作为路由默认提供)这些值基本上等于localhost/application/index/index
请求网址。
如果您希望RenderAction
能够正常工作,则必须这样称呼它:
<% Html.RenderAction("Navigator", "Application", new { id = 0 }); %>
等于localhost/application/0/navigator
请求网址。
但是你很快就会发现你的路线不起作用,你必须改变它(因为我想你不喜欢在你的URL中增加0)。如果您提供有关您的路线工作的信息(或者您决定切换action
和id
的原因),我们可以提供有助于您满足要求的答案。