ASP.NET-MVC。如何从URL获取控制器名称?

时间:2009-10-20 03:22:37

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

如何使用我在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”我想要产品(控制器名称)。是否有任何现有的方法已经这样做了?

3 个答案:

答案 0 :(得分:6)

你可能应该像George建议的那样添加另一条路线,但是如果你真的只需要从路线派生的控制器值,你可以在你的控制器动作方法中做到这一点:

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

答案 1 :(得分:4)

请参阅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中的类名。

祝你好运!

答案 2 :(得分:1)

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

您随时可以向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可能会出错。