ASP.NET MVC 中的动态路由操作名称
Dynamic routing action name in ASP.NET MVC
我想创建到 URL 的动态路由,如下所示:
http://localhost:51577/Item/AnyActionName/Id
请注意,控制器名称是静态的,不需要是动态的。另一方面,我需要让动作名称部分动态,这样无论在 URL 的那部分写什么,我都会将用户重定向到 Item
控制器内的 Index
动作.
目前我尝试过的是:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
"Items",
"Item/{action}/{id}",
new { controller = "Item", action = "Index", id = UrlParameter.Optional });
}
当我构建我的应用程序时,出现以下错误:
The resource cannot be found.
编辑:
这是我的 Global.asax
文件和 routeconfig.cs
文件:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
这里是 RouteConfig.cs
文件的内容以及@Nkosi 提供的答案:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Items",
url: "Item/{id}/{*slug}",
defaults: new { controller = "Item", action = "Index", slug = UrlParameter.Optional }
);
}
}
你在问题中指的是鼻涕虫。
我在这里回答了类似的网络问题 api
最后的 slug 路由配置看起来像这样
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Items",
url: "Item/{id}/{*slug}",
defaults: new { controller = "Item", action = "Index", slug = RouteParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
可以匹配示例控制器操作...
public class ItemController : Controller {
public ActionResult Index(int id, string slug = null) {
//...
}
}
示例URL...
"Item/31223512/Any-Item-Name"
那么参数匹配如下...
id = 31223512
slug = "Any-Item-Name"
而且因为 slug 是可选的,上面的 URL 仍然会匹配到
"Item/31223512"
我想创建到 URL 的动态路由,如下所示:
http://localhost:51577/Item/AnyActionName/Id
请注意,控制器名称是静态的,不需要是动态的。另一方面,我需要让动作名称部分动态,这样无论在 URL 的那部分写什么,我都会将用户重定向到 Item
控制器内的 Index
动作.
目前我尝试过的是:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
"Items",
"Item/{action}/{id}",
new { controller = "Item", action = "Index", id = UrlParameter.Optional });
}
当我构建我的应用程序时,出现以下错误:
The resource cannot be found.
编辑:
这是我的 Global.asax
文件和 routeconfig.cs
文件:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
这里是 RouteConfig.cs
文件的内容以及@Nkosi 提供的答案:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Items",
url: "Item/{id}/{*slug}",
defaults: new { controller = "Item", action = "Index", slug = UrlParameter.Optional }
);
}
}
你在问题中指的是鼻涕虫。
我在这里回答了类似的网络问题 api
最后的 slug 路由配置看起来像这样
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Items",
url: "Item/{id}/{*slug}",
defaults: new { controller = "Item", action = "Index", slug = RouteParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
可以匹配示例控制器操作...
public class ItemController : Controller {
public ActionResult Index(int id, string slug = null) {
//...
}
}
示例URL...
"Item/31223512/Any-Item-Name"
那么参数匹配如下...
id = 31223512
slug = "Any-Item-Name"
而且因为 slug 是可选的,上面的 URL 仍然会匹配到
"Item/31223512"