ASP.NET MVC映射字符串URL到路由值对象

时间:2010-06-14 11:03:02

标签: asp.net-mvc string object routing

我正在使用区域创建模块化ASP.NET MVC应用程序。简而言之,我创建了一条贪婪的路线,捕获以{application} / {* catchAll}开头的所有路线。

以下是行动:

// get /application/index  
public ActionResult Index(string application, object catchAll)  
{  
  // forward to partial request to return partial view  
  ViewData["partialRequest"] = new PartialRequest(catchAll);  

  // this gets called in the view page and uses a partial request class to return a partial view  
}  

示例:

Url“/ Application / Accounts / LogOn”将导致Index操作将“/ Accounts / LogOn”传递给PartialRequest,但作为字符串值。

// partial request constructor  
public PartialRequest(object routeValues)  
{  
  RouteValueDictionary = new RouteValueDictionary(routeValues);  
}  

在这种情况下,路由值字典不会返回routeData的任何值,而如果我在Index Action中指定路由:

ViewData["partialRequest"] = new PartialRequest(new { controller = "accounts", action = "logon" });

它工作正常,routeData值包含“controller”键和“action”键;而之前,钥匙是空的,因此班上的其他人都不会工作。

所以我的问题是,如何将catchAll中的“/ Accounts / LogOn”转换为“new {controller =”accounts“,action =”logon“}”??

如果不清楚,我会解释更多! :)

马特

这是我所拥有的“最接近的”,但它显然不适用于复杂的路线:

// split values into array
var routeParts = catchAll.ToString().Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);  

// feels like a hack
catchAll = new
{
  controller = routeParts[0],
  action = routeParts[1]
}; 

1 个答案:

答案 0 :(得分:0)

您需要知道catchAll参数中的哪个部分。然后你需要自己解析它(就像你在你的例子中做或使用正则表达式)。框架无法知道控制器名称的哪个部分以及操作名称等等,因为您没有在路径中指定。

你为什么要做这样的事情?可能有更好的方法。