【问题标题】:ASP.Net MVC Redirect Specific Routes to External SiteASP.Net MVC 将特定路由重定向到外部站点
【发布时间】:2015-06-23 18:43:45
【问题描述】:

我有一个运行良好的 ASP.Net MVC 站点,使用简单的标准路由方案:

routes.MapRoute(
    "Default",                                              
    "{controller}/{action}/{id}",                           
    new { controller = "Home", action = "Index", id = "" }
);

我的客户希望将静态页面重定向到辅助站点,以便他们可以随意编辑它们,模板样式。实际执行某些操作的页面将保留在原始站点上。

我需要做的是为我的功能视图/控制器操作设置路由,并将剩余的 url 重定向到外部站点,无论指定的 url 是否具有匹配的控制器/操作。我不想弄乱现有代码,而是使用路由来执行某些页面并从其他页面重定向。

例如:

mysite.com/sponsors/signup 将被执行

mysite.com/sponsors/information 将被重定向

即使赞助商控制器包含注册和信息的操作,并且存在注册和信息的现有视图。

到目前为止,我一直无法想出一种方法来做到这一点。

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc redirect controller routing


    【解决方案1】:

    您可以使用attribute routing 来简化操作。

    您的 RouteConfig 将如下所示:

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapMvcAttributeRoutes(); // enable attribute routing
    
            routes.MapRoute(
                "Default",                                              
               "{controller}/{action}/{id}",                           
               new { controller = "Home", action = "Index", id = "" }
          );
        }
    }
    

    然后您可以添加如下操作:

    public class SponsorsController : Controller
    {
    
        [Route("sponsors/information")]
        public ActionResult RedirectInformation()
        { 
            return RedirectPermanent("http://yoururl.com");
        }
    }
    

    编辑一个

    如果您不想使用属性路由,您仍然需要该操作,但您的 RouteConfig 将如下所示:

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            //The order is important here
            routes.MapRoute(
                name: "redirectRoute",
                url: "sponsors/information",
                defaults: new { controller = "Home", action = "RedirectToInformation"}
            );
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
    
    
        }
    }
    

    在这样的路由中,如果找到匹配项,则忽略其余路由。因此,您希望将最具体的路线放在顶部,将最通用的路线放在底部

    编辑两个(根据评论)

    您可以在 Web.config 中放置一个简单的 appsettings,如下所示:

    <appSettings>
      <add key="UseAttributeRouting" value="true" />
    </appSettings>
    

    然后在RegisterRoutes,您可以像下面这样阅读并做出决定。

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            if (Convert.ToBoolean(ConfigurationManager.AppSettings["UseAttributeRouting"]))
            {
                routes.MapMvcAttributeRoutes();
            }
            else
            {
                routes.MapRoute(
                    name: "redirectRoute",
                    url: "sponsors/information",
                    defaults: new {controller = "Home", action = "RedirectToInformation"}
                    );
            }
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    } 
    

    浏览器有时会缓存这些重定向,因此如果您更改这些设置,您可能需要建议清除浏览器缓存。检查此superuser post 以清除 Chrome 的缓存。

    【讨论】:

    • 非常感谢!属性路由可能是我最好的选择。我在帖子中没有提到的一件事是,我希望能够通过 web.config 应用程序设置关闭重定向功能。如果我使用属性路由,我是否可以通过有条件地包含 routes.MapMvcAttributeRoutes(); 来关闭它。在我的代码路径中?这个网站有一个孤儿院赞助计划,我所有的时间都被捐赠了。感谢您提供时间和专业知识!
    • @TracyFletcher 欢迎您! :) 你捐出时间真是太棒了,我很乐意帮忙。请检查我的编辑。
    • 谢谢,感谢您的客气话和帮助。是的,您的编辑正是我所想的。最后一个问题,我可以在单个控制器操作上使用多个属性吗?
    • 例如[Route("赞助商/信息")] [Route("AboutUs/ContactUs")]等
    • 是的,你可以有多个这样的路由属性。
    【解决方案2】:

    你有两个选择 i) 这是编写由自定义 IRoutehandler 实例化的自定义 mvchandler 的完美用例。你可以按照这个例子。

    http://www.eworldui.net/blog/post/2008/04/aspnet-mvc---legacy-url-routing.aspx.

    ii) 您可以为这些匹配路径编写 HttpHandler,您可以将它们重定向到其他站点。

    【讨论】:

    • 非常感谢您的帮助!我使用现有的控制器和操作代码捕获了一个完全有效的 mvc 路径。我是否正确地说,如果我的自定义 mvc 处理程序出现在 global.asax 中的注册路由列表中,在通用处理程序之前,并重定向到外部 url,我应该很好吗?
    • 谢谢!重定向运行良好。不过,一个奇怪的副作用出现了。我的 ActionLink 解析不正确。我的 Global.asax.cs 有许多条目,例如: routes.Add("ContactUs", new HardRedirect("ContactUs", strRedirectURL, new HardRedirectHandler()));
    • 现在我的 ActionLinks 像: 正在生成这样的链接:localhost:49268/…,而不是localhost:49268/OrphanageKids/Edit/60
    【解决方案3】:

    第 1 步:将其添加到 RouteConfig.cs

    routes.IgnoreRoute("yourwebpage.aspx");

    第 2 步:在网站根目录创建名为“yourwebpage.aspx”的新文件

    第3步:在yourwebpage.aspx里面放:

        <%
        Response.RedirectPermanent("http://yourwebsite.com");
         %>
    

    【讨论】:

      【解决方案4】:

      这很简单。

      创建一个动作

        public ActionResult ext(string s)
              {
                  return Redirect(s);
              }
      

      并在 Routeconfig 文件中添加

      routes.MapRoute(name: "Default17", url: "routeyouwant", defaults: new { controller = "Home", action = "ext", s = "http://externalurl.com" });
      

      【讨论】:

        猜你喜欢
        • 2012-01-27
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2019-07-26
        • 2016-03-05
        • 2010-09-19
        • 1970-01-01
        相关资源
        最近更新 更多