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

2024-03-28

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

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

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

有任何想法吗?


您可以使用属性路由 http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx让事情变得更容易。

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

EDIT ONE

如果您不想使用属性路由,您仍然需要该操作,但您的 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>
  <add key="UseAttributeRouting" value="true" />
</appSettings>

Then in 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 }
        );
    }
} 

浏览器有时会缓存这些重定向,因此如果您更改这些设置,您可能需要建议清除浏览器缓存。检查这个超级用户帖子 https://superuser.com/questions/304589/how-can-i-make-chrome-stop-caching-redirects用于清除 Chrome 缓存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.Net MVC 将特定路由重定向到外部站点 的相关文章

随机推荐