我正在尝试使用HttpContext.Current.Request.RawUrl
在global.asax文件中获取页面请求的网址段。我的代码如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { controller = "Home|Account" }
);
var url = HttpContext.Current.Request.RawUrl;
var pageTitle = url.Split('/')[1];
routes.MapRoute(
"SendToCustomController",
"{*url}",
new { controller = "Custom", action = "Index", title = pageTitle }
);
}
如果我第一次输入devserver:1234 / test等地址,我会将字符串'test'发送到控制器。问题是,在后续请求中有不同的段,例如devserver:1234 / confused,我仍然会将'test'发送到控制器。
这样做的目的是对于没有指定控制器的任何请求,URL的控制器段将传递给自定义页面控制器,该控制器将查看DB中是否有任何用户生成的页面具有该标题。如果有,则会加载页面,如果没有标准404将被抛出。
任何帮助解决上述问题,或者更好的方法来实现这一目标都会很棒!
答案 0 :(得分:1)
您的路由令牌在注册中被称为{url}
,然后您使用了一些title = pageTitle
约束,我不知道它来自哪里(实际上它在您的RegisterRoutes静态方法中是硬编码的,显然是运行的对于第一个命中它的应用程序,应用程序的整个生命周期只有一次)。您应该避免访问HttpContext
方法中相关的任何Application_Start
。如果你在IIS7 +集成管道模式下运行,那甚至都不允许。
请尝试以下方法:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { controller = "Home|Account" }
);
routes.MapRoute(
"SendToCustomController",
"{*url}",
new { controller = "Custom", action = "Index" }
);
}
然后:
public class CustomController : Controller
{
public ActionResult Index(string url)
{
// TODO: do your checks here based upon the url parameter
// and return HttpNotFound(); in case it doesn't match anything
}
}