12 asp.net-mvc asp.net-mvc-routing
我想知道如何定义这样的路由映射:
{TreePath}/{Action}{Id}
Run Code Online (Sandbox Code Playgroud)
TreeMap是从数据库动态加载的,如下所示:
'Gallery/GalleryA/SubGalleryA/View/3'
Run Code Online (Sandbox Code Playgroud)
chr*_*166 13
您可以创建自定义路由处理程序来执行此操作.实际路线是一个全能的:
routes.MapRoute(
"Tree",
"Tree/{*path}",
new { controller = "Tree", action = "Index" })
.RouteHandler = new TreeRouteHandler();
Run Code Online (Sandbox Code Playgroud)
树处理程序查看路径,将最后一部分提取为操作,然后重定向到控制器.动作部分也从路径中删除.添加{id}部分应该很简单.
public class TreeRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
string path = requestContext.RouteData.Values["path"] as string;
if (path != null)
{
int idx = path.LastIndexOf('/');
if (idx >= 0)
{
string actionName = path.Substring(idx+1);
if (actionName.Length > 0)
{
requestContext.RouteData.Values["action"] = actionName;
requestContext.RouteData.Values["path"] =
path.Substring(0, idx);
}
}
}
return new MvcHandler(requestContext);
}
}
Run Code Online (Sandbox Code Playgroud)
您的控制器然后按预期工作:
public class TreeController : Controller
{
public ActionResult DoStuff(string path)
{
ViewData["path"] = path;
return View("Index");
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以调用URL了/Tree/Node1/Node2/Node3/DoStuff.动作获得的路径是Node1/Node2/Node3
可以换一下网址吗?如果您可以将 {TreePath} 参数作为最后一个参数,则可以通过一条路由轻松完成此操作。
routes.MapRoute("TreeRoute",
"{Action}/{id}/{*TreePath}",
new TreeRouteHandler()));
Run Code Online (Sandbox Code Playgroud)
但通配符包罗万象的参数必须是最后一个参数。
否则,我认为您将不得不定义多个参数,其中一个参数与 TreeMap URL 的每个可能部分相匹配。
请注意,如果两个路由参数之间没有文字文本,则永远无法一起定义它们。换句话说,你可以定义{Action}/{Id},但你永远无法定义{Action}{Id}。当模式匹配时,路由引擎无法知道一个参数在哪里结束以及下一个参数在哪里开始。
| 归档时间: |
|
| 查看次数: |
6102 次 |
| 最近记录: |