【发布时间】:2012-03-15 13:03:27
【问题描述】:
我在使用 ASP.NET MVC 时遇到了一个看似奇怪的问题。
我们为客户 X 建立了一个网站并将其部署在他们的服务器上。第一个问题是它位于 Novel Access Manager 后面,因此对页面的所有请求都会通过:
https://portal.customerx.com/intranet/tool/{这里开始我的 MVC 路线}
出于这个原因,我这样设置 Globol.asax:
routes.MapRoute(
"SubfolderZielsetzung", // Route name
"intranet/tool" + "{controller}/{action}/{objectOneId}", // URL with parameters
new { controller = "Home", action = "Index", objectOneId = "objectOneId" } // Parameter defaults
);
现在的请求是我在主页上添加一个超链接到他们的 Intranet 中的静态网站:
https://portal.customerx.com/asdf/foo/bar/1337/test-1
如果我只是在主页中添加以下 HTML 标记:
<a href="https://portal.customerx.com/asdf/foo/bar/1337/test-1">Support</a>
所以现在奇怪的事情来了。这是将从引擎渲染的内容:
<a href="https://portal.customerx.com/intranet/tool/asdf/foo/bar/1337/test-1">
由于某种原因,我无法得到答案,即使我没有使用任何 Html Helpers 并在“https://portal.customerx.com/”之后设置 URL 前缀,路由引擎也会更改我的超链接
编辑
我昨天写道,我找到了答案,但事实证明它也不是答案。
我在 Global Asax 的顶部放置了以下路线作为本文的提示: Asp.net MVC and redirect to External site
routes.MapRoute(
"RedirectSiteRoute",
"{site}",
new { },
new { site = new SiteRouteConstraint() }
);
和:
public class SiteRouteConstraint : IRouteConstraint
{
public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
string[] allowedSites = new[] { "https://portal.customerx.com/intranet/tool/asdf/foo/bar/1337/test-1" };
return allowedSites.Any(x => x == values[parameterName].ToString());
}
}
然后我将所有带有 URL 前缀的路由移动到全局 asax 的底部,所以现在我所有没有 URL_Prefix 的路由都在顶部。
这就是它的样子:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"RedirectSiteRoute",
"{site}",
new { },
new { site = new SiteRouteConstraint() }
);
routes.MapRoute(
"Grundauftrag", // Route name
"{controller}/{action}/{objectOneId}/{objectTwoId}/{objectThreeId}", // URL with parameters
new { controller = "Home", action = "Index", objectOneId = "objectOneId", objectTwoId = "objectTwoId", objectThreeId = "objectThreeId" } // Parameter defaults
);
routes.MapRoute(
"Zielsetzung", // Route name
"{controller}/{action}/{objectOneId}/{objectTwoId}", // URL with parameters
new { controller = "Home", action = "Index", objectOneId = "objectOneId", objectTwoId = "objectTwoId" } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{objectOneId}", // URL with parameters
new { controller = "Home", action = "Index", objectOneId = "objectOneId" } // Parameter defaults
);
routes.MapRoute(
"SubfolderGrundauftrag", // Route name
Const.URL_PREFIX + "{controller}/{action}/{objectOneId}/{objectTwoId}/{objectThreeId}", // URL with parameters
new { controller = "Home", action = "Index", objectOneId = "objectOneId", objectTwoId = "objectTwoId", objectThreeId = "objectThreeId" } // Parameter defaults
);
routes.MapRoute(
"SubfolderZielsetzung", // Route name
Const.URL_PREFIX + "{controller}/{action}/{objectOneId}/{objectTwoId}", // URL with parameters
new { controller = "Home", action = "Index", objectOneId = "objectOneId", objectTwoId = "objectTwoId" } // Parameter defaults
);
routes.MapRoute(
"Subfolder", // Route name
Const.URL_PREFIX + "{controller}/{action}/{objectOneId}", // URL with parameters
new { controller = "Home", action = "Index", objectOneId = "objectOneId" } // Parameter defaults
);
}
在客户平台上,静态链接可以正常工作。但是现在我页面中的所有其他链接都不再起作用了......
我必须将带有 URL_Prefix 的路由放回顶部才能让它再次工作,但现在静态链接当然不再工作了。
有什么想法吗?
【问题讨论】:
-
portal.customerx.com/intranet/tool/asdf/foo/bar/1337/test-1 - 这个结果的查看代码是什么
-
希望我理解正确,在我的 _Layout.cshtml 页面中我有以下行:portal.customerx.com/intranet/tool/asdf/foo/bar/1337/…>
-
不幸的是无法测试你的问题,但我开始了解问题所在。简单的解决方法是为特定的 url 放置 iis 重写规则。无论如何,我只是无法理解您如何在静态 href 中更改 url
-
好的,你能给我推荐一篇关于它的好文章吗?
-
ASP.NET 不能更改硬编码链接,如果这就是您所说的话。您以某种方式误解了您所看到的内容。硬编码链接只是不被解释的字符。唯一的可能是响应过滤器或 http-proxy,两者都不太可能。
标签: asp.net-mvc asp.net-mvc-routing