【问题标题】:Dynamic routing action name in ASP.NET MVCASP.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 以及你希望它如何映射到吗?

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


【解决方案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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2023-03-05
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多