ASP.Net MVC2:无法使RewritePath与* .aspx目标一起使用

时间:2012-01-26 10:01:47

标签: asp.net asp.net-mvc-2

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的级联调用。

一如既往地谢谢 达菲

1 个答案:

答案 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路径匹配,那么你应该在路由级别这样做。