ASP.Net MVC将特定路由重定向到外部站点

时间:2015-04-17 04:28:08

标签: asp.net-mvc redirect controller routing

我有一个运行良好的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将被重定向

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

到目前为止,我无法绕过这样做的方式。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

您可以使用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的缓存。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

routes.IgnoreRoute( “yourwebpage.aspx”);

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

Step3:在yourwebpage.aspx里面放:

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

答案 3 :(得分:0)

这很简单。

创建一个动作

  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" });