我对ASP.NET MVC有一个看似奇怪的问题。
我们为Customer X构建了一个网站,并将其部署在他们的服务器上。第一个问题是它位于新型访问管理器之后,因此对页面的所有请求都会通过:
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助手并在“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的路由放回到顶部才能再次工作,但现在静态链接不再起作用了。
任何想法?
答案 0 :(得分:0)
添加https://否则IIS会从您网站的根目录
中查找此资源答案 1 :(得分:0)
我遇到了类似的问题,我需要以不同的方式绑定传入和传出路由。
我通过首先放入传入的绑定来做到这一点(因为你无法真正强制传入特定路线)。对于传出链接,我使用Html.RouteLink,我可以指定我想使用哪条路线而不管它的位置。