开发者

ASP.NET MVC Map String Url To A Route Value Object

I am creating a modular ASP.NET MVC application using areas. In short, I have created a greedy route that captures all routes beginning with {application}/{*catchAll}.

Here is the action:

// 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  
}  

Example:

The Url "/Application/Accounts/LogOn" will then cause the Index action to pass "/Accounts/LogOn" into the PartialRequest, but as a string value.

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

In this case, the route value dictionary will not return any values for the routeData, whereas if I specify a route in the Index Action:

ViewData["partialRequest"] = n开发者_JAVA技巧ew PartialRequest(new { controller = "accounts", action = "logon" });

It works, and the routeData values contains a "controller" key and an "action" key; whereas before, the keys are empty, and therefore the rest of the class wont work.

So my question is, how can I convert the "/Accounts/LogOn" in the catchAll to "new { controller = "accounts", action = "logon" }"??

If this is not clear, I will explain more! :)

Matt

This is the "closest" I have got, but it obviously wont work for complex routes:

// 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]
}; 


You need to know what part is what in the catchAll parameter. Then you need to parse it yourself (like you are doing in your example or use a regexp). There is no way for the framework to know what part is the controller name and what is the action name and so on, as you haven't specified that in your route.

Why do you want to do something like this? There is probably a better way.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜