我有一个运行良好的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将被重定向
即使赞助商控制器包含注册和信息的操作,也存在注册和信息的现有视图。
到目前为止,我无法绕过这样做的方式。
有什么想法吗?
答案 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" });