我创建了一个混合的MVC和Web窗体网站-使用以后的Visual Studio 2013工具非常容易。一切正常,我可以正确导航到MVC和Web窗体页面。
但是,我想做的是将所有Web表单页面都放在一个特定的子目录中,然后在不使用该子目录的情况下路由到它们。
/
+ Content
+ Controllers
+ Models
+ Scripts
+ Views
+ WebPages
+ Default.aspx
+ MyWebForm.aspx
因此,我希望能够访问:
/WebPages/Default.aspx as /Default.aspx or even just /
/WebPages/MyWebForm.aspx as /MyWebForm.aspx
这可能吗?
任何意见,将不胜感激。
最佳答案
作为起点,我们可以在App_Start / RouteConfig.cs中为Webforms页面添加特定的路由:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//specific page route
routes.MapPageRoute("forms", "forms", "~/Webforms/RootForm.aspx");
//specific pattern to a directory
routes.MapPageRoute("webformsmap", "{page}.aspx", "~/Webforms/{page}.aspx");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
编辑
经过研究,我已经找到您想要的东西。
我创建了一个有用的自定义IRouteHandler以实现更好的功能。这样,您可以将Webforms * .aspx页面的整个目录映射到一条路由。看看这个:
public class DirectoryRouteHandler : IRouteHandler
{
private readonly string _virtualDir;
public DirectoryRouteHandler(string virtualDir)
{
_virtualDir = virtualDir;
}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var routeValues = requestContext.RouteData.Values;
if (!routeValues.ContainsKey("page")) return null;
var page = routeValues["page"].ToString();
if (!page.EndsWith(".aspx"))
page += ".aspx";
var pageVirtualPath = string.Format("{0}/{1}", _virtualDir, page);
return new PageRouteHandler(pageVirtualPath, true).GetHttpHandler(requestContext);
}
}
通过使用DirectoryRouteHandler,您可以很好地实现您的目标。
网址“〜/ somepage.aspx”将映射到“〜/ WebForms / somepage.aspx”
routes.Add("rootforms", new Route("{page}.aspx",
new DirectoryRouteHandler(virtualDir: "~/WebForms")));
网址“〜/ forms / somepage”将映射到“〜/ WebForms / somepage.aspx”
routes.Add("webforms", new Route("forms/{page}",
new DirectoryRouteHandler(virtualDir: "~/WebForms")));