2

我正在致力于http://mvcforum.codeplex.com项目。ASP.NET MVC 3路由问题

我们有2个区域,Forum和ForumAdmin。

我有几个命名的路线,做一个漂亮的URL与论坛/主题标题中的网址:

context.MapRoute("ShowTopic", "Forum/Topic/{id}/{title}", new { controller = "Topic", action = "Index" }); 
context.MapRoute("ShowForum", "Forum/Forum/{id}/{title}", new { controller = "Forum", action = "Index" }); 
context.MapRoute("ShowCategory", "Forum/Category/{id}/{title}", new { controller = "Category", action = "Index" }); 

context.MapRoute(
    "Forum_default", 
    "Forum/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new string[] { "mvcForum.Web.Areas.Forum.Controllers" } 
); 

所以这几乎是按预期工作。当我只是浏览论坛,一切工作正常,但是当我需要发布一个主题(创建主题控制器上的方法),它失败:

参数字典包含参数 无效项“身份证'的 不可为空的类型'System.Int32'为 方法'System.Web.Mvc.ActionResult 索引(Int32,System.String,Int32)'in 'mvcForum.Web.Areas.Forum.Controllers.ForumController' 。 可选参数必须是 参考类型,可为空的类型,或者将其声明为可选参数 。 参数名称:参数

或多或少归结为不能触及Create方法,但选择了Index方法。

任何想法是什么我做错了?什么路线我应该/不必得到这个工作?

在此先感谢! 斯蒂恩

回答

4

的URL Forum/Topic/Create会打的路线Forum/Topic/{id}/{title}

的问题是,路由Forum/Topic/{id}/{title}Forum/{controller}/{action}/{id}大多是没有区别(请问你的路由引擎知道,“创建”是不是为主题路线的id

因此,我不知道只是声明了每个动作用自己的路线没有更好的办法:

context.MapRoute("CreateTopic", "Forum/Topic/Create/", 
    new { controller = "Topic", action = "Create" }); 
context.MapRoute("ShowTopic", "Forum/Topic/{id}/{title}", 
    new { controller = "Topic", action = "Index" }); 
+0

这是我是一个有点害怕,那样我就必须为每一个动作创建命名路线。 – 2011-05-10 08:02:44

+0

真正的问题是,“ShowTopic”路由具有“Topic”作为URL的一部分,在这种情况下,它与实际的Controller匹配。现在我想这个解决方案是重写“ShowTopic”路由到没有Topic作为第2部分的东西。 – 2011-05-11 07:39:39