如何根据以下架构映射路由?

时间:2011-05-17 06:52:32

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

如何映射此网址
/主题/主题名称/操作?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。)

3 个答案:

答案 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包。 也可以为进一步的场景提供帮助......