ASP.Net MVC的路由魔术偶尔会让我感到困惑,尤其是在错误处理和重定向方面。
为什么http://foobar.com/Home/Index有效但http://foobar.com/Home/Index.aspx生成404?
这对我很重要,因为我想偶尔进行重定向:
protected void Application_BeginRequest(object sender, EventArgs e) {
if (some condition) {
HttpContext.Current.RewritePath("Home/Index.aspx");
}
}
就目前而言,此代码段不起作用。如果我留下.aspx后缀,我得到404,如果我删除它,我会得到一个对Application_BeginRequest的级联调用。
一如既往地谢谢 达菲
答案 0 :(得分:0)
ASP.NET MVC根据路由中定义的url-pattern规则映射URL。仅当不存在与给定URL匹配的路由规则时,MVC才会假定所请求的URL是针对物理文件的(并且仅当该功能也被启用时)。
那就是说,除非你有一个匹配“home / index.aspx”的路由模式(或路由,如果你愿意),那么没有定义处理器来处理该URL,MVC将重新进入假设请求物理文件。由于该路径上没有物理文件,因此它返回404 - 实际上,该文件不存在:我知道你确实拥有它,但它位于不同的位置(/views/home/index.aspx).
但是,即使您确实请求了正确的路径(例如“/views/home/index.aspx”),您仍然会得到404,因为“views”文件夹中有一个web.config文件,其中包含禁止以这种方式访问所有文件的规则(基本上只能从控制器中访问它们)。
因此,如果您需要将请求转移到另一个控制器/操作,那么有几种方法可以做到这一点。看看这些线程是否会对您有所帮助:
How to simulate Server.Transfer in ASP.NET MVC?
How do I use Server.Transfer method in asp.net MVC?
哦,如果“some_condition”纯粹是URL路径匹配,那么你应该在路由级别这样做。