我想知道如何定义这样的路由图:
{TreePath}/{Action}{Id}
TreeMap 是从数据库中动态加载的,如下所示:
'Gallery/GalleryA/SubGalleryA/View/3'
我想知道如何定义这样的路由图:
{TreePath}/{Action}{Id}
TreeMap 是从数据库中动态加载的,如下所示:
'Gallery/GalleryA/SubGalleryA/View/3'
您可以创建一个自定义路由处理程序来执行此操作。实际路线是包罗万象的:
routes.MapRoute(
"Tree",
"Tree/{*path}",
new { controller = "Tree", action = "Index" })
.RouteHandler = new TreeRouteHandler();
树处理程序查看路径,将最后一部分提取为操作,然后重定向到控制器。动作部分也从路径中删除。添加 {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);
}
}
然后,您的控制器将按您的预期工作:
public class TreeController : Controller
{
public ActionResult DoStuff(string path)
{
ViewData["path"] = path;
return View("Index");
}
}
现在您可以调用 URL,如/Tree/Node1/Node2/Node3/DoStuff
. 动作得到的路径是Node1/Node2/Node3
可以换个网址吗?如果您可以将 {TreePath} 参数作为最后一个参数,则可以使用一条路线轻松完成此操作。
routes.MapRoute("TreeRoute",
"{Action}/{id}/{*TreePath}",
new TreeRouteHandler()));
通配符 catchall 参数必须是最后一个参数。
否则,我认为您将不得不定义多个参数,一个来匹配 TreeMap URL 的每个可能部分。
请注意,如果两个路由参数之间没有一些文字文本,则永远不能一起定义它们。换句话说,你可以定义{Action}/{Id}
,但你永远不能定义{Action}{Id}
。当模式匹配时,路由引擎无法知道一个参数在哪里结束,而下一个参数从哪里开始。
您可以在查询字符串中包含“贪婪”部分,只要您可以在它之后有固定部分,例如
/{*TreePath}/Edit/{id}
/{*TreePath}/Action/{id}
请注意,上述路由中的操作不是可变的,因为贪婪的部分需要在某个文字值处停止(其他正斜杠)。如果您只在“树”上执行一些操作,我会工作,但如果您有很多操作会很麻烦,因为每个操作都需要自己的路由条目。
它不能开箱即用,但需要自定义路由。您可以在此处找到有关该主题的精彩文章,包括代码
我是 MVC 的新手,但其中一个要求是这个选项。我是一个 vb-er,所以我在转换代码时遇到了一些麻烦,但让它工作并想贡献一个示例解决方案: www.proovit.com/Download/MvcApplication1.zip 这是一个简单的标准 MVC 项目,我离开了代码和 bin 目录,但您可以从标准项目中复制它们。
o,您必须使用标签 app/bla/bla/bla 用于索引和 app/trade/order/view 用于订单页面。