3

我正在为公司 Intranet 站点开发 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,如果这给任何人任何线索的话。

4

2 回答 2

2

正如 nemesv 上面指出的那样,答案是该Url.Action方法始终将 URL 生成为 /App/... 但访问管理器应用程序会识别某些标签(例如<a href="/App/..."><form action="/App/...">等)并将 /PHILSAPP 添加到开头. 我正在探索的解决方案是编写一些扩展方法UrlHelperHtmlHelper生成绝对 URL,而不是相对 URL,其中将在 web.config 文件中指定包含 /PHILSAPP 的主机名。如果有人仍然有任何其他建议来解决这个问题,我会很高兴听到他们的声音,但除此之外,我对使用它作为解决方法感到满意。

一些样板代码开始:

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);
        }
    }
}
于 2013-01-04T20:44:10.433 回答
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与我们的相对路径连接。

希望它对你的情况也有帮助。

于 2014-03-04T17:00:41.363 回答