【问题标题】:ASP.NET-MVC . How to get the controller name from an url?ASP.NET-MVC 。如何从 url 获取控制器名称?
【发布时间】:2009-10-20 03:22:36
【问题描述】:

如何使用我在 Global.asax 中定义的路由获取相对 Url 的控制器名称?

例子:

如果我有这样的路由防御:

routes.MapRoute(
                "Default",                                              // Route name
                "{language}/{controller}/{action}/{id}",                 // URL with parameters
                new { controller = "Home", action = "Index", id = "", language = "en" }

从字符串“~/en/products/list”我想要产品(控制器名称)。是否有任何现有的方法已经这样做了?

【问题讨论】:

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


【解决方案1】:

您可能应该像 George 建议的那样添加另一条路线,但如果您真的只需要从该路线派生的控制器值,您可以在您的控制器操作方法中执行此操作:

var controller = (string)RouteData.Values["controller"];

【讨论】:

  • 如何从任意 url 而不是从 RouteData 获取控制器名称?
  • @Gregoire?您是指您网站上的任意网址还是其他人的网址?如果在您的网站上,那么他会告诉您如何操作。
  • 不,因为它只适用于当前 URL,如果我没有做错的话(它适用于 Http 当前上下文)
【解决方案2】:

查看 Stephen Walther 的博文ASP.NET MVC Tip #13 – Unit Test Your Custom Routes

MvcFakes 项目有一个旧的 System.Web.Abstractions 引用。所以你必须更换它 使用新的并重新编译项目以获得MvcFakes.dll。

这是我的代码:

public string getControllerNameFromUrl()
{
    RouteCollection rc = new RouteCollection();
    MvcApplication.RegisterRoutes(rc);
    System.Web.Routing.RouteData rd = new RouteData();
    var context = new FakeHttpContext("\\" + HttpContext.Request.Url.AbsolutePath);
    rd = rc.GetRouteData(context);
    return rd.Values["action"].ToString();
}

在我上面的代码中,“MvcApplication”是 Global.asax 中的类名。

祝你好运!

【讨论】:

  • Stephen Walther 上面的博客链接仍然有效。但是,一旦在他的网站上,下载链接失败,提示 #12 的链接也失败 - 所以我无法获得 FakeHttpContext 类的列表。你知道其他地方可以获得类似的功能吗?
【解决方案3】:

我不确定你在问什么,所以如果我的回答有误,那是因为我在猜测你想要什么。

您可以随时向您的Global.asax 添加其他路由。这通常是处理“不正常”案件的最简单方法。

如果你想返回一个产品列表,你会使用这个路由:

routes.MapRoute(
            "ProductList",         
            "{language}/{products}/{action}/",
            new { controller = "Products", action = "List", language = "en" });

如果不止一种类型的实体将使用此路由,您还可以将产品替换为更通用的 {controller}。您应该根据需要对其进行修改。

例如,要使其成为可用于获取任何产品列表的通用路由:

routes.MapRoute(
            "ProductList",         
            "{language}/{controller}/{action}/",
            new { controller = "Products", action = "List", language = "en" });

这样做是它创建了一条路线(您应该始终将其放在Default 路线之前),上面写着“对于用户输入的任何内容,请给我他们要求的控制器和操作”。 (如/en/Products/List,或/en/Users/List)。

要访问该控制器,您只需导航到以下内容:yoursite.com/en/products/list。您也可以使用HTMLActionLink访问控制器。

<%=Html.ActionLink("Product", "List", new { controller = Products }, null ) %>

我在没有打开 IDE 的情况下编写此代码,因此 ActionLink 可能有错误。

【讨论】:

  • 感谢您花时间回答我,但我正在寻找的是一个“反向”GetRoute 函数,即来自一个 url(不是当前的),我希望能够提取控制器名称
  • @Gregoire 太好了,呃,你为什么不一开始就这么说?
  • 对不起,我犯了一个错误,因为我认为它已经足够清楚了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多