我正在为企业内部网站点开发MVC 3应用程序,我遇到一些URL帮助程序的问题,有时候不会生成正确的URL。应用程序通过由我们的IT部门控制的访问管理器应用程序访问,该应用程序基本上提供标准化URL,以便用户不需要知道有关服务器的任何信息。例如,要直接在服务器上访问应用程序,我会访问:
http://philsserver/App
通过访问管理器,我将使用IT部门提供的URL:
http://secureintranet/PHILSAPP/App/
我在我的应用程序的几个地方使用MVC URL助手 - 问题是有时“PHILSAPP”部分被遗漏 - 当我在“<a>
”链接中使用它时,它可以工作,但是当我在其他地方使用它时,它没有。
例如,代码:
<a href="@Url.Action("Index", "FormsAndTemplates")">
正确创建链接:
<a href="/PHILSAPP/App/FormsAndTemplates">
。
以下代码:
@Html.TextBox("lastName", ViewBag.LastName as string, new { @class = "input-mini", @autocomplete = Url.Action("QuickSearch", "Employee") })
产生:
<input autocomplete="/App/Employee/QuickSearch" class="input-mini" id="lastName" name="lastName" type="text" value="" />
请注意,此URL不包含“PHILSAPP”部分。如果我在javascript中使用URL帮助程序或者只使用“<a>
”标记以外的任何位置,也会发生这种情况。有谁知道为什么会发生这种情况?据我所知,对Url.Action的两次调用几乎都是一样的,所以我无法弄清楚为什么会发生这种情况。如果这个问题已经得到解答,我很抱歉,但是我无法找到有关类似问题的人的任何信息。提前感谢您的任何帮助。
更新: 根据要求,我的路线如下:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
更新2:正在使用的访问管理器是Tivoli Identity Manager,如果这给任何人提供任何线索。
答案 0 :(得分:2)
正如nemesv上面指出的那样,答案是Url.Action
方法始终生成URL为/ App / ...但访问管理器应用程序会识别某些标记(例如<a href="/App/...">
, <form action="/App/...">
等)并将/ PHILSAPP添加到开头。我正在探索的解决方案是为UrlHelper
和HtmlHelper
编写一些扩展方法来生成绝对URL而不是相对URL,其中包含/ PHILSAPP的主机名将在web.config文件中指定。如果有人还有任何其他建议可以解决这个问题,我会很高兴听到他们的意见,但除此之外,我对使用它作为解决方案感到满意。
开头的一些样板代码:
namespace MvcApplicationNameSpace
{
/// <summary>
/// Extension methods to the UrlHelper class for generating absolute URLs using
/// Web.config settings
/// </summary>
public static class UrlHelperExtensions
{
private static string BaseUrl
{
get
{
return System.Configuration.ConfigurationManager.AppSettings["BaseUrl"];
}
}
/// <summary>
/// Generates a string for the absolute URL to an action method
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string AbsoluteAction(this UrlHelper url)
{
return BaseUrl + url.Action();
}
/// <summary>
/// Generates a string for the absolute URL to an action method with the
/// specified name
/// </summary>
/// <param name="url"></param>
/// <param name="actionName"></param>
/// <returns></returns>
public static string AbsoluteAction(this UrlHelper url, string actionName)
{
return BaseUrl + url.Action(actionName);
}
/// <summary>
/// Generates a string for the absolute URL to an action method with the
/// specified name and route values
/// </summary>
/// <param name="url"></param>
/// <param name="actionName"></param>
/// <param name="routeValues"></param>
/// <returns></returns>
public static string AbsoluteAction(this UrlHelper url, string actionName, object routeValues)
{
return BaseUrl + url.Action(actionName, routeValues);
}
/// <summary>
/// Generates a string for the absolute URL to an action method with the
/// specified name and route values
/// </summary>
/// <param name="url"></param>
/// <param name="actionName"></param>
/// <param name="routeValues"></param>
/// <returns></returns>
public static string AbsoluteAction(this UrlHelper url, string actionName, RouteValueDictionary routeValues)
{
return BaseUrl + url.Action(actionName, routeValues);
}
/// <summary>
/// Generates a string for the absolute URL to an action method and
/// controller
/// </summary>
/// <param name="url"></param>
/// <param name="actionName"></param>
/// <param name="controllerName"></param>
/// <returns></returns>
public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName)
{
return BaseUrl + url.Action(actionName, controllerName);
}
/// <summary>
/// Generates a string for the absolute URL to an action method and
/// controller, including route values
/// </summary>
/// <param name="url"></param>
/// <param name="actionName"></param>
/// <param name="controllerName"></param>
/// <param name="routeValues"></param>
/// <returns></returns>
public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues)
{
return BaseUrl + url.Action(actionName, controllerName, routeValues);
}
/// <summary>
/// Generates a string for the absolute URL to an action method and
/// controller, including route values
/// </summary>
/// <param name="url"></param>
/// <param name="actionName"></param>
/// <param name="controllerName"></param>
/// <param name="routeValues"></param>
/// <returns></returns>
public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, RouteValueDictionary routeValues)
{
return BaseUrl + url.Action(actionName, controllerName, routeValues);
}
}
}
答案 1 :(得分:0)
我们的安全入口服务器背后存在同样的问题。 对于REST调用,我们希望在服务器端生成URL以使它们在java脚本中可用。但它们不包括安全入口服务器添加的子路径。
所以我们提出了类似的解决方法(在布局页面中呈现):
<a id="urlBase" href="/" style="display: none;"></a>
<script type="text/javascript">
baseUrl = document.getElementById('urlBase').getAttribute('href');
</script>
href="/"
已被href="/path/"
的入口服务器替换,我们可以在访问REST服务时轻松地将baseUrl
与我们的相对路径连接起来。
希望它对你的情况也有帮助。