ASP.NET MVC 中的动态路由操作名称
Posted
技术标签:
【中文标题】ASP.NET MVC 中的动态路由操作名称【英文标题】:Dynamic routing action name in ASP.NET MVC 【发布时间】:2017-01-04 05:55:26 【问题描述】:我想创建一个到如下 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 );
当我构建我的应用程序时,我收到以下错误:
找不到资源。
编辑:
这是我的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
);
【问题讨论】:
所以即使有人请求item/create
,它也应该进入索引操作?
是的,但它永远不会是项目/创建,它将是项目的名称:)
那么你是说 url 的 action 部分是项目的名称吗?你有参数吗?你能分享 Index 操作方法签名和你试图访问的 url 吗?
是的,我可以分享,项目的 ID 是我将用于检索项目数据的参数,动态操作名称只是为了使其更人性化: )
你能分享你正在尝试的 url 以及你希望它如何映射到吗?
【参考方案1】:
您在问题中所指的内容称为蛞蝓。
我在这里为 web api 回答了一个类似的问题
Web api - how to route using slugs?
在末尾加上 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)
//...
示例网址...
"Item/31223512/Any-Item-Name"
然后将参数匹配如下...
id = 31223512
slug = "Any-Item-Name"
而且因为 slug 是可选的,所以上面的 URL 仍然会匹配到
"Item/31223512"
【讨论】:
以上是关于ASP.NET MVC 中的动态路由操作名称的主要内容,如果未能解决你的问题,请参考以下文章