如何将URL的控制器段发送到ASP.NET MVC控制器
问题描述:
我试图使用HttpContext.Current.Request.RawUrl
来获取global.asax文件中的页面请求的URL段。我的代码如下:如何将URL的控制器段发送到ASP.NET MVC控制器
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 /测试时,得到的字符串“测试”通过发送到控制器。问题是,在随后的请求中,如devserver:1234/confused具有不同的段,我仍然会将'test'发送到控制器。
这样做的目的是为了没有指定控制器的任何请求,URL的控制器段被传递给自定义页面控制器,该自定义页面控制器将查看DB中是否有用户生成的页面。如果有的话,页面将被加载,如果没有标准的404将被抛出。
任何帮助理清上面的问题,或更好的方法来实现这一点将是伟大的!
答
您的路线令牌称为在注册{url}
,然后你使用一些title = pageTitle
约束,我不它是从哪里来的认识(实际上它是硬编码在你的RegisterRoutes这显然是对的整个生命周期只运行一次静态方法第一个请求的应用程序)。你应该避免访问与你的Application_Start
方法相关的任何东西HttpContext
。如果你在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
}
}
我简直不敢相信它是如此直截了当。我花了大约一个半小时在这! Thankyou :) – Chris 2012-02-12 09:25:37
@ChrisPaynter,在ASP.NET MVC中进行路由并不是最简单的事情,但是一旦你明白了它的工作原理,就不会有任何问题。你有关于这个线程的进一步问题吗? – 2012-02-12 09:49:10
不,现在我应该没事,谢谢Darin。 – Chris 2012-02-12 10:32:43