我正在使用区域创建模块化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]
};
答案 0 :(得分:0)
您需要知道catchAll参数中的哪个部分。然后你需要自己解析它(就像你在你的例子中做或使用正则表达式)。框架无法知道控制器名称的哪个部分以及操作名称等等,因为您没有在路径中指定。
你为什么要做这样的事情?可能有更好的方法。