我想为所有网站网址设置一个控制器 例如:
网址会手动创建,网址也可以是“每种类型”(从某种程度上说,你必须能够将所有内容放入网址) 我不想在网址中添加控制器名称或任何内容(操作名称或ID)。
如何为此编写网址路由规则?我并不担心这种设计的缺点。 这是默认的ASP.NET MVC路由规则
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
答案 0 :(得分:1)
我不会告诉你这是一个糟糕的计划。但它是。无论如何,如果你不需要处理无限的url文件夹深度,诀窍就是以相反的顺序运行:
//maps virtual redirects
routes.MapRoute("virtual redirects",
"{redirect}",
new
{
area = "",
controller = "Content",
action = "VirtualRedirect"
}
);
routes.MapRoute("two level",
"{firstPart}/{secondPart}",
new
{
area = "",
controller = "Content",
action = "PageUrl",
thirdPart = ""
}
);
//maps general content pages
routes.MapRoute("page catcher",
"{firstPart}/{secondPart}/{thirdPart}",
new
{
area = "",
controller = "Content",
action = "PageUrl"
}
);
请注意,您需要在此之上放置任何更具体的路由,并且您仍然需要在此之后声明的默认路由,以便MVC的某些部分能够正常工作。
答案 1 :(得分:1)
我认为你可以这样做,只需覆盖routHandler
routes.MapRoute(
"dbroute",
"{controller}/{action}/{id}",
new { id = "" }
).RouteHandler = new MyRouteHandler();
和你这样的新路线处理程序
public class MyRouteHandler : IRouteHandler
{
#region IRouteHandler Members
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
IRouteHandler handler = new MvcRouteHandler();
var vals = requestContext.RouteData.Values;
if (vals["controller"] != null &&
(vals["controller"].ToString() == "page1" ||
vals["controller"].ToString() == "another" ||
vals["controller"].ToString() == "others" ) )
{
vals["controller"] = "Test";// your controller;
vals["action"] = "Index";//your action
}
return handler.GetHttpHandler(requestContext);
}
#endregion
}
答案 2 :(得分:0)
伊戈尔,
除非有一个非常令人信服的理由这样做,否则我会考虑使用其他方式来展示您想要的网址,并考虑每个逻辑单元正在执行的“隐蔽”功能。我回答了一个类似的问题,我回答:
What is the advantage of using multiple Controller classes in ASP.NET MVC?
可能会给你一些想法。