ASP.NET MVCでアクションの絶対URLを見つけるにはどうすればよいですか?


239

私はこのようなことをする必要があります:

<script type="text/javascript">
    token_url = "http://example.com/your_token_url";
</script>

MVCのベータ版を使用していますが、アクションの絶対URLを取得する方法がわかりません。私はこのようなことをしたいと思います:

<%= Url.AbsoluteAction("Action","Controller")) %>

このためのヘルパーまたはページメソッドはありますか?

回答:


480

クリックしてここに詳細については、しかしesentially拡張メソッドは必要ありません。すでに直感的に理解できているわけではありません。

Url.Action("Action", null, null, Request.Url.Scheme);

6
興味深いので、プロトコルを指定すると、URLは絶対的なものになります
Casebash

24
この回答の方が優れています。これにより、Resharperはアクションとコントローラーが存在することを検証できます。httpではなくRequest.Url.Schemeを使用することをお勧めします。これにより、httpとhttpsの両方がサポートされます。
Pbirkoff 2012年

2
@Pbirkoff、これが最良の答えであることに同意しますが、ReSharperがパラメーターがアクション/コントローラーを表すことを知るために独自のメソッドに注釈を付けることができることを知りたいかもしれません。このようにして、R#は提供する文字列を検証できます。
Drew Noakes

3
ちょっとした改善は、"http"をに置き換えるRequest.Url.Schemeことです。これにより、HTTPSを使用する場合、生成されたURLもHTTPSを使用します。
Erik Schierboom、

1
これも機能しHtml.ActionLinkます(プロトコルを使用するメソッド、たとえばMVC 4の最後の2つ)
Chris

74

UrlHelperを拡張する

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string AbsoluteAction(this UrlHelper url, string action, string controller)
        {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;

            string absoluteAction = string.Format(
                "{0}://{1}{2}",
                requestUrl.Scheme,
                requestUrl.Authority,
                url.Action(action, controller));

            return absoluteAction;
        }
    }
}

次に、このように呼び出します

<%= Url.AbsoluteAction("Dashboard", "Account")%>

編集-再編注釈

受け入れられた回答に関する最も賛成のコメントは次のとおりです。This answer is the better one, this way Resharper can still validate that the Action and Controller exists.ここに、同じ動作を得る方法の例を示します。

using JetBrains.Annotations

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string AbsoluteAction(
            this UrlHelper url,
            [AspMvcAction]
            string action,
            [AspMvcController]
            string controller)
        {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;

            string absoluteAction = string.Format(
                "{0}://{1}{2}",
                requestUrl.Scheme,
                requestUrl.Authority,
                url.Action(action, controller));

            return absoluteAction;
        }
    }
}

サポート情報:


3
このソリューションにはオプションのパラメーターも追加します。これですべてのケースがカバーされます。
ユージニュートリカ2009年

非常に素晴らしい!私はこのコードを使用しましたが、呼び出し元が好きなUrlメソッド(ルーター値など)を使用してそれを作成できるように、唯一の引数relativeUrlを作成しました。だから私のものです:AbsoluteUrl(このUrlHelperのURL、文字列relativeUrl)。
Rob Kent


21

@Charlinoの回答をガイドとして使用して、これを思いつきました。

UrlHelperASP.NET MVCドキュメントは、ホスト名とプロトコルが渡された場合、Url.Actionが完全修飾URLを返すことを示しています。これらのヘルパーを作成して、ホスト名とプロトコルを強制的に提供しました。複数のオーバーロードは、Url.Actionのオーバーロードを反映しています。

using System.Web.Routing;

namespace System.Web.Mvc {
    public static class HtmlExtensions {

        public static string AbsoluteAction(this UrlHelper url, string actionName) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, null, (RouteValueDictionary)null, 
                              requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            object routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, null, new RouteValueDictionary(routeValues), 
                              requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            RouteValueDictionary routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, null, routeValues, requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, (RouteValueDictionary)null, 
                              requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName, 
                                            object routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, 
                              new RouteValueDictionary(routeValues), requestUrl.Scheme, 
                              null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName, 
                                            RouteValueDictionary routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, routeValues, requestUrl.Scheme, 
                              null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName, object routeValues, 
                                            string protocol) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, 
                              new RouteValueDictionary(routeValues), protocol, null);
        }

    }
}

4
コードのThxは、私を助けてくれましたが、このソリューションには、開発中に通常発生する問題があります。サイトが特定のポートでホストされている場合、ポート情報はrequestUrl.Authorityに含まれています localhost:4423のようにます。何らかの理由で、Actionメソッドはポートを再度追加します。したがって、これはアクションメソッド内のバグであるか、ここにポートを提供することは想定されていません。しかし、リクエストで利用可能なプロパティのうち、どれが正しいものですか(DnsSafeHostまたはHost)?まあ解決策はかなり単純です:ちょうど供給ヌルとアクションメソッドが正しい値を記入します。
ntziolis 2010

回答を更新して、@ ntziolisの提案を組み込みました。
Andrew Arnott 2012

3

組み込みの方法があるかどうかはわかりませんが、独自のHtmlHelperメソッドをロールすることができます。

次のようなもの

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string AbsoluteAction(this HtmlHelper html, string actionUrl)
        {
            Uri requestUrl = html.ViewContext.HttpContext.Request.Url;

            string absoluteAction = string.Format("{0}://{1}{2}",
                                                  requestUrl.Scheme,
                                                  requestUrl.Authority,
                                                  actionUrl);

            return absoluteAction;
        }
    }
}

次に、このように呼び出します

<%= Html.AbsoluteAction(Url.Action("Dashboard", "Account"))%> »

HTH、チャールズ


2

引数付きの完全な答えは次のようになります:

var url = Url.Action("ActionName", "ControllerName", new { id = "arg_value" }, Request.Url.Scheme);

そしてそれは絶対URLを生成します


1

同じ結果ですが、少しわかりやすくなっています(文字列の連結/フォーマットはありません)。

public static Uri GetBaseUrl(this UrlHelper url)
{
    Uri contextUri = new Uri(url.RequestContext.HttpContext.Request.Url, url.RequestContext.HttpContext.Request.RawUrl);
    UriBuilder realmUri = new UriBuilder(contextUri) { Path = url.RequestContext.HttpContext.Request.ApplicationPath, Query = null, Fragment = null };
    return realmUri.Uri;
}

public static string ActionAbsolute(this UrlHelper url, string actionName, string controllerName)
{
    return new Uri(GetBaseUrl(url), url.Action(actionName, controllerName)).AbsoluteUri;
}

0

多分これ(?):

<%= 
  Request.Url.GetLeftPart(UriPartial.Authority) + 
  Url.Action("Action1", "Controller2", new {param1="bla", param2="blabla" })
%>

0

env:dotnet coreバージョン1.0.4

Url.Action("Join",null, null,Context.Request.IsHttps?"https":"http");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.