asp.net mvC语言 mvc 3 Url Helper给出错误的Url



我正在为公司内部网站点开发MVC 3应用程序,并且我在URL帮助器中遇到一些问题,有时不能生成正确的URL。这个应用程序是通过一个由我们的IT部门控制的访问管理器应用程序来访问的,它基本上提供了一个标准化的URL,这样用户就不需要知道关于服务器的任何信息。例如,要在服务器上直接访问应用程序,我将访问:

http://philsserver/App

通过访问管理器,我会使用IT部门提供的URL:

http://secureintranet/PHILSAPP/App/

我在应用程序的几个地方使用MVC URL helper -问题是有时"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。动作几乎是一样的,所以我不明白为什么会发生这种情况。如果这个问题已经被回答了,我很抱歉,但是我没有找到任何关于有类似问题的人的信息。事先感谢您的帮助。

更新:按照要求,我的路由如下:

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,如果这给任何人任何线索的话。

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

一些样板代码开头:

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);
        }
    }
}

我们的安全入口服务器也有同样的问题。对于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与我们的相对路径连接起来。

相关内容

  • 没有找到相关文章

最新更新