如何让T4MVC使用“{controller} / {action} / {id}”之类的路由?

时间:2014-01-30 11:32:37

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

我有一个ASP.NET MVC 5网站。

根据各种博客中的建议,我使用T4MVC来改变我的路由:

context.MapRoute(
    name:"MyArea_default",
    url:"MyArea/{controller}/{action}/{id}",
    defaults:new { action = "Index", id = UrlParameter.Optional }
);

...到...

context.MapRoute(
    name: "MyArea_default",
    url: "MyArea/{controller}/{action}",
    defaults: MVC.MyArea.Orders.Index()
);

这“工作”,但我确实想知道从URL模式中删除{id}段。当然,URL已经从(例如)改变了:

/MyArea/Orders/Edit/1

...为:

/MyArea/Orders/Edit?id=1

我真的不喜欢查询字符串参数,所以我想使用上一个表单。

我尝试将{id}部分放回路径定义中:

context.MapRoute(
    name: "MyArea_default",
    url: "MyArea/{controller}/{action}/{id}",
    defaults: MVC.MyArea.Orders.Index()
);

...但当然默认值不再为id提供默认值,因此不起作用。如果Index操作采用了可选的id参数,那么我就可以执行此操作:

context.MapRoute(
    name: "MyArea_default",
    url: "MyArea/{controller}/{action}/{id}",
    defaults: MVC.MyArea.Orders.Index(null) // <- DEFAULT FOR ID
);

......但事实并非如此,所以我被困住了。

另外,我很担心现在在路由定义中指定了特定的控制器。在T4MVC更改之前,路由未指定控制器。新风格现在是否意味着我需要一个每个控制器的路由?

1 个答案:

答案 0 :(得分:3)

你应该只看T4MVC作为打字辅助工具以避免神奇的价值。除此之外,一切都以同样的方式运作,因此您不再需要与特定控制器相关联。

要解决您的问题,请尝试:

defaults: MVC.MyArea.Orders.Index().AddRouteValue("id", UrlParameter.Optional)