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.
Надеюсь, это поможет и в вашем случае.