对于以下情况,我应该在 ASP.net MVC 中使用 4 个单独的路由吗?
Should I be using 4 separate routes in ASP.net MVC for the following scenario?
给出以下 4 url 种可能性:
http://www.domain.com/channels/16/animals-and-pets/views/1
http://www.domain.com/channels/16/animals-and-pets/views
http://www.domain.com/channels/16/animals-and-pets/1
http://www.domain.com/channels/16/animals-and-pets
我应该创建 4 个不同的 MVC 路由还是有更好的方法来处理这些路由?我能以某种方式使用一条路线处理所有这些可能的 url 吗?
这些路线看起来正确吗?
URL: /channels/16/animals-and-pets/views/1
routes.MapRoute(
name: "ChannelSortsWithPageNum",
url: "channels/{ChannelID}/{ChannelLink}/{Sort}/{PageNum}",
defaults: new {
controller = "Channels",
action = "Channel",
ChannelID = "",
ChannelLink = "",
Sort = UrlParameter.Optional,
PageNum = UrlParameter.Optional
},
constraints: new { PageNum = @"\d+" }
);
//URL: /channels/16/animals-and-pets/views
routes.MapRoute(
name: "ChannelSortsWithNOPageNum",
url: "channels/{ChannelID}/{ChannelLink}/{Sort}",
defaults: new {
controller = "Channels",
action = "Channel",
ChannelID = "",
ChannelLink = "",
Sort = UrlParameter.Optional
}
);
//URL: /channels/16/animals-and-pets/1
routes.MapRoute(
name: "ChannelWithPageNum",
url: "channels/{ChannelID}/{ChannelLink}/{PageNum}",
defaults: new {
controller = "Channels",
action = "Channel",
ChannelID = "",
ChannelLink = "",
PageNum = UrlParameter.Optional
},
constraints: new { PageNum = @"\d+" }
);
//URL: /channels/16/animals-and-pets
routes.MapRoute(
name: "Channel",
url: "channels/{ChannelID}/{ChannelLink}",
defaults: new {
controller = "Channels",
action = "Channel",
ChannelID = "",
ChannelLink = ""
}
);
我自己想出来的。我决定使用 ASP.NET MVC 5 属性路由而不是 RouteConfig.cs。
在 RouteConfig.cs 中,我使用以下方法启用了属性路由:
routes.MapMvcAttributeRoutes();
然后我在我的控制器上定义路由,如下所示:
[Route("channels/{ChannelID:int}/{ChannelLink:regex(^[a-zA-Z-]+$)}/{Sort:alpha?}/{PageNum:int?}")]
[Route("channels/{ChannelID:int}/{ChannelLink:regex(^[a-zA-Z-]+$)}/{PageNum:int?}")]
public ActionResult Channel(int ChannelID, string ChannelLink, string Sort, int? PageNum)
{
etc...
}
它现在就像一个魅力。
给出以下 4 url 种可能性:
http://www.domain.com/channels/16/animals-and-pets/views/1
http://www.domain.com/channels/16/animals-and-pets/views
http://www.domain.com/channels/16/animals-and-pets/1
http://www.domain.com/channels/16/animals-and-pets
我应该创建 4 个不同的 MVC 路由还是有更好的方法来处理这些路由?我能以某种方式使用一条路线处理所有这些可能的 url 吗?
这些路线看起来正确吗?
URL: /channels/16/animals-and-pets/views/1
routes.MapRoute(
name: "ChannelSortsWithPageNum",
url: "channels/{ChannelID}/{ChannelLink}/{Sort}/{PageNum}",
defaults: new {
controller = "Channels",
action = "Channel",
ChannelID = "",
ChannelLink = "",
Sort = UrlParameter.Optional,
PageNum = UrlParameter.Optional
},
constraints: new { PageNum = @"\d+" }
);
//URL: /channels/16/animals-and-pets/views
routes.MapRoute(
name: "ChannelSortsWithNOPageNum",
url: "channels/{ChannelID}/{ChannelLink}/{Sort}",
defaults: new {
controller = "Channels",
action = "Channel",
ChannelID = "",
ChannelLink = "",
Sort = UrlParameter.Optional
}
);
//URL: /channels/16/animals-and-pets/1
routes.MapRoute(
name: "ChannelWithPageNum",
url: "channels/{ChannelID}/{ChannelLink}/{PageNum}",
defaults: new {
controller = "Channels",
action = "Channel",
ChannelID = "",
ChannelLink = "",
PageNum = UrlParameter.Optional
},
constraints: new { PageNum = @"\d+" }
);
//URL: /channels/16/animals-and-pets
routes.MapRoute(
name: "Channel",
url: "channels/{ChannelID}/{ChannelLink}",
defaults: new {
controller = "Channels",
action = "Channel",
ChannelID = "",
ChannelLink = ""
}
);
我自己想出来的。我决定使用 ASP.NET MVC 5 属性路由而不是 RouteConfig.cs。
在 RouteConfig.cs 中,我使用以下方法启用了属性路由:
routes.MapMvcAttributeRoutes();
然后我在我的控制器上定义路由,如下所示:
[Route("channels/{ChannelID:int}/{ChannelLink:regex(^[a-zA-Z-]+$)}/{Sort:alpha?}/{PageNum:int?}")]
[Route("channels/{ChannelID:int}/{ChannelLink:regex(^[a-zA-Z-]+$)}/{PageNum:int?}")]
public ActionResult Channel(int ChannelID, string ChannelLink, string Sort, int? PageNum)
{
etc...
}
它现在就像一个魅力。