3

企業のイントラネット サイト用に MVC 3 アプリケーションを開発していますが、URL ヘルパーが正しい URL を生成しないことがあるという問題があります。アプリケーションは、ユーザーがサーバーに関する情報を知る必要がないように、基本的に標準化された URL を提供する IT 部門によって制御されるアクセス マネージャー アプリケーションを介してアクセスされます。たとえば、サーバー上のアプリケーションに直接アクセスするには、次の場所にアクセスします。

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」の部分が含まれていないことに注意してください。<a>これは、JavaScript で 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: 使用されているアクセス マネージャーは、Tivoli Identity Manager です。

4

2 に答える 2

2

上で nemesv が指摘したように、Url.Actionメソッドは常に /App/... として URL を生成していましたが、アクセス マネージャー アプリケーションは特定のタグ ( <a href="/App/..."><form action="/App/...">など) を認識し、先頭に /PHILSAPP を追加するというのが答えでした。 . 私が検討している解決策は、/PHILSAPP を含むホスト名が web.config ファイルで指定される相対 URL ではなく、絶対 URL を生成する拡張メソッドUrlHelperを作成することです。HtmlHelperこれを解決するための他の提案がある場合は、喜んでお聞きしますが、それ以外の場合は、これを回避策として使用することに満足しています.

いくつかのボイラープレート コードから始めます。

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="/"はエントリ サーバーによって に置き換えられており、REST サービスにアクセスするときに相対パスとhref="/path/"簡単に連結できます。baseUrl

あなたの場合にも役立つことを願っています。

于 2014-03-04T17:00:41.363 に答える