3

我正在爲公司Intranet站點開發MVC 3應用程序,並且我有一些URL助手有時會產生錯誤的URL。應用程序正在通過由我們的IT部門控制的訪問管理器應用程序訪問,該應用程序基本上提供了一個標準化的URL,以便用戶不需要知道有關服務器的任何信息。例如,直接訪問服務器上的應用程序,我將訪問:MVC 3 Url Helper給出不正確的URL

http://philsserver/App 

通過訪問管理器,我將使用由IT部門提供的網址:

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助手,也會發生這種情況。有誰知道爲什麼會發生這種情況?據我所知,這兩個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:使用Access Manager的Tivoli Identity Manager的如果,讓任何人的任何線索。

+0

你能張貼你的路線嗎? – Xharze

+0

我不熟悉Tivoli Identity Manager,但通常反向代理通常會在生成的HTML發送到客戶端瀏覽器之前進行更改。 HTML的這種交替可以影響urls,css以及java腳本。所以我的猜測是:Url.Action總是生成正確的url。但是在'href'裏面,你的反向代理修改它。但它不能正確檢測'autocomplete'屬性中的url,並保持不變。所以我應該建議與您的IT部門聯繫,告知您的反向代理配置。 – nemesv

回答

2

正如nemesv上文指出,答案是,Url.Action方法總是生成的URL爲/應用/ ...但接入管理器應用程序會識別特定標籤(如<a href="/App/..."><form action="/App/...">等),並會將/ PHILSAPP添加到開頭。我正在探索的解決方案是爲UrlHelperHtmlHelper編寫一些擴展方法來生成絕對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); 
     } 
    } 
} 
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/"取代的由入門級服務器和訪問時,我們可以很容易地串聯baseUrl與我們的相對路徑REST服務。

希望它對你的情況也有幫助。