MVC 3 Url Helper дает неверный URL

Я занимаюсь разработкой приложения MVC 3 для корпоративного сайта в интрасети, и у меня возникают некоторые проблемы с помощником URL, иногда он не выдает правильные URL. Доступ к приложению осуществляется через приложение диспетчера доступа, которое контролируется нашим ИТ-отделом, который в основном предоставляет стандартизированный URL-адрес, так что пользователю не нужно знать какую-либо информацию о сервере. Например, чтобы получить доступ к приложению непосредственно на сервере, я бы посетил:

http://philsserver/App

Через диспетчер доступа я бы использовал URL, предоставленный ИТ-отделом:

http://secureintranet/PHILSAPP/App/

Я использую помощник URL MVC в нескольких местах в моем приложении - проблема в том, что иногда часть "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". Это также происходит, если я использую помощник URL в JavaScript или где-либо еще, кроме "<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, если он дает кому-либо какие-либо подсказки.

2 ответа

Решение

Как указывалось выше, ответом было то, что 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);
        }
    }
}

У нас точно такая же проблема была за нашим защищенным сервером входа. Для вызовов 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/"и мы могли бы легко объединить baseUrl с нашими относительными путями при доступе к службам REST.

Надеюсь, это поможет и в вашем случае.

Другие вопросы по тегам