【问题标题】:Converting web forms site to MVC将 Web 表单站点转换为 MVC
【发布时间】:2014-01-17 21:01:55
【问题描述】:

这似乎是一个常见问题,但我在任何地方都找不到答案。

首先是一些背景。我有一个带有 ASPX Web 表单的 ASP.NET 网站。当浏览器请求 http://www.mysite.com/somefolder/ 时,IIS 会提供 /somefolder/default.aspx 的内容。 http://www.mysite.com/somefolder/default.aspx 的请求也会收到 /somefolder/default.aspx

现在回答问题。我想逐渐将网站转换为 MVC 和 Razor。需要做什么才能让 MVC 处理对 http://www.mysite.com/somefolder/ 的请求,并且对 http://www.mysite.com/somefolder/default.aspx 的请求获得 301 重定向到 http://www.mysite.com/somefolder/?

编辑

这里有一些额外的信息可以澄清我上面的问题。

过去,每当我“停用”一个 ASPX 页面时,我都会在其代码隐藏中放置一个 Response.RedirectPermanent 以重定向到替换页面。当 default.aspx 被 MVC/Razor 替换时,是否应该在这种情况下继续这种做法,或者如果发生不同的事情(例如删除 default.aspx 并使用路由来处理请求http://www.mysite.com/somefolder/default.aspx)?

【问题讨论】:

  • 这可能是您想要做的事情:hanselman.com/blog/…
  • 这是一篇很好的文章@CAbbott,但我没有看到它在哪里解决了我的问题。
  • 你可以看看这个帖子:How to redirect Homepage.aspx to an MVC default route? 它是被接受的答案。
  • @afzalulh:我是 MVC 及其路由机制的新手,所以我需要一些时间来尝试您提到的内容。 (不过看起来很有希望!)
  • 实现基本路由配置,然后将过滤器添加到您的项目中......这将是更简洁的解决方案......

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


【解决方案1】:

编辑:有一个简单的解决方案。在 Route.Config 中,添加 routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

并在 Global.asax.cs 中添加:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var requestUrl = Request.Url.ToString().ToLower();

    //Default.aspx is converted to "Home/Index"
    if (requestUrl.Contains("/default.aspx"))
    {
        Context.Response.StatusCode = 301;
        Context.Response.Redirect("/Home/Index");
    }
}  

您可能需要解析requestUrl,以防参数被传递到页面。

我建议阅读以下内容:ASP.NET MVC - Legacy Url Routing,这将有助于构建更好的解决方案。

【讨论】:

  • 请原谅我的无知,但是,如果使用此解决方案,如果请求mysite.com/somefolder/default.aspx 并且 /somefolder/default.aspx 尚未转换为 MVC,会发生什么? IIS 和客户端不会进入无限循环,浏览器请求 /somefolder/default.aspx,IIS 说重定向到 /somefolder/default.aspx,浏览器再次请求 /somefolder/default.aspx,IIS 再次重定向,等等?
  • @Theophilus - 不,如果页面存在,它将通过(注意 "{id}.aspx",)。我没有注意到的一个问题,如果文件不存在,它将进入无限循环。我已经编辑了我的答案。
  • 经过很长时间的延迟后,我可以恢复这个问题。我进行了您建议的更改,但在 Global.asax.cs 中 requestUrl.Contains 方法的内容已更改为"/somefolder/",因为我担心子文件夹级别而不是根目录的重定向。当我尝试浏览到 /somefolder/ 时,Firefox 报告“页面未正确重定向”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2014-12-14
相关资源
最近更新 更多