【问题标题】:How to create wildcard controller in ASP.NET MVC?如何在 ASP.NET MVC 中创建通配符控制器?
【发布时间】:2011-11-14 11:26:02
【问题描述】:

在默认应用程序 ASP.NET MVC 3.0 应用程序中,我有一个带有 Index() 和 Details(string id) 方法的控制器。这些映射到 /orders/ 和 orders/details/ORDER_ID_HERE。如何更改路由,以便 Details 映射到 orders/ORDER_ID_HERE,并继续让 Index() 提供默认索引页面?

【问题讨论】:

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


    【解决方案1】:

    如果您要向您的路由集合添加一条新路由,例如:

    routes.MapRoute(
        "Detailed", // Route name
        "{contoller}/{id}", // URL with parameters
        new { controller = "Orders", action = "Details", id = UrlParameter.Optional } // Parameter defaults
    );
    

    它会起作用,但你会破坏很多东西,例如像 [site]/Home/Search 这样的 url 会导致:

    System.ArgumentException:参数字典包含“MvcApplication3.Controllers”中方法“System.Web.Mvc.ActionResult Details(Int32)”的不可空类型“System.Int32”的参数“id”的空条目。 OrdersController'。

    原因是 /Home/Search 匹配路由{controller}/{id}

    另一种类似的解决方法是:

    routes.MapRoute(
        "Detailed", // Route name
        "order/{id}", // URL with parameters
        new { controller = "Orders", action = "Details", id = UrlParameter.Optional } // Parameter defaults
    );
    

    确保路由中的静态部分 order 与您的实际订单控制器的名称不匹配,否则您将遇到同样的问题,呈现 [url]/使用 System.ArgumentException 而不是调用 Index() 方法(默认路由)无法访问订单

    这种方法的不利方面是,您需要为每个希望拥有此类功能的控制器执行此操作。

    【讨论】:

    • 防止主页/搜索错误。您可以使用正则表达式强制 id 只能是数字。 routes.MapRoute("", "{controller}/{id}", new { controller = "Orders", action = "Detail" }, new { id = @"\d+" });
    • 后来想起了,你可以指定约束。所以你可以为 id 和控制器定义一个约束,所以它只会使用 Orders 控制器
    【解决方案2】:

    尝试在默认路由之前添加此路由:

    routes.MapRoute("SomeName", "{controller}/{id}", new { controller = "Orders", action = "Details" });
    

    注意如何从 URL 参数中删除 {action}。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-16
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多