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