如何映射此网址
/主题/主题名称/操作?topicId = someInt
主题是控制器名称(这是常量 - 它总是显示为“主题”),
topicName 被忽略
操作是操作名称,
someInt 是“action”的topicId参数。
以下是几个例子:
/ Topic / c-sharp / AddQuestion?topicId = 1
调用:
控制器:主题
行动:AddQuestion
topicId = 1
这是TopicConroller
public ActionResult AddQuestion(int topicId)
另一个例子:
/ Topic / MySql-queries / AddSubTopic?topicId = 1
调用:
控制器:主题
行动:AddSubTopic
topicId = 1
这是TopicConroller
public ActionResult AddSubTopic(int topicId)
等。 (Topic控制器中的所有操作只接收一个参数 - 即主题的id。)
答案 0 :(得分:2)
routes.MapRoute(
"Topics",
"Topic/{topicName}/{action}",
new { controller = "Topic", action = "Index" }
);
你将拥有:
public class TopicController: Controller
{
public ActionResult AddQuestion(int topicId)
{
...
}
}
如果您关心主题名称,您可以让控制器操作将其作为操作参数:
public ActionResult AddQuestion(int topicId, string topicName)
{
...
}
答案 1 :(得分:1)
你试过了吗?
routes.MapRoute(
"Default",
"{controller}/{topic}/{action}/{id}",
new { controller = "Home", action = "Index" }
);
另一种方法是像stackoverflow那样做。看一下问题网址,问题是在id之后,可能会被忽略。
routes.MapRoute(
"Default",
"{controller}/{action}/{id}/{*catchall}",
new { controller = "Home", action = "Index" }
);
答案 2 :(得分:1)
我发现这个工具路由调试器非常有用,可以测试我到达完美路径的方式
http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx
现在它还有一个nuget包。 也可以为进一步的场景提供帮助......