web-dev-qa-db-ja.com

ASP.NET MVCアクションから絶対URLを取得する

これはおそらくダミーの質問ですが、明確な兆候を見つけることができません。 MVC3 WebアプリケーションにPOCOクラスがあり、その唯一の目的はサーバー内のいくつかのファイルのバックアップを管理することです。通常、バックアップを作成し、ファイル名をコントローラーに返します。コントローラーは、ダウンロード用のURLを記載したメールを送信します。これは正常に機能しますが、送信する絶対URLを作成できません。どの関数を使用しても、常に/ Backup/TheFile.Zipのような相対URLを取得します。 http://www.somesite.com/Backup/TheFile.Zip。私は試した:

VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.Zip");
HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.Zip";
Url.Content("~/Backup/SomeFile.Zip");

しかし、それらはすべて/ Backup/SomeFile.Zipのようなものを返します。何か案が?

69
Naftis

次の方法で実行できます。

_var urlBuilder =
    new System.UriBuilder(Request.Url.AbsoluteUri)
        {
            Path = Url.Action("Action", "Controller"),
            Query = null,
        };

Uri uri = urlBuilder.Uri;
string url = urlBuilder.ToString();
// or urlBuilder.Uri.ToString()
_

このサンプルのUrl.Action()の代わりに、Url.Content()または任意のルーティングメソッドを使用するか、実際にパスを渡すこともできます。

ただし、URLがControllerActionに移動する場合、よりコンパクトな方法があります。

_var contactUsUriString =
    Url.Action("Contact-Us", "About",
               routeValues: null /* specify if needed */,
               protocol: Request.Url.Scheme /* This is the trick */);
_

ここでのコツは、ルーティングメソッドを呼び出すときにprotocol/schemeを指定すると、絶対URLを取得することです。 可能な場合はこれをお勧めしますが、最初の例では必要に応じてより一般的な方法もあります。

私はそれについてここで詳細にブログに書いています:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

MeligyのAngularJSおよびWeb Dev Goodiesニュースレターから抽出

107
Meligy

コントローラー内から:

var path = VirtualPathUtility.ToAbsolute(pathFromPoco);
var url = new Uri(Request.Url, path).AbsoluteUri
35
Chris

これは私のために働く:

using System;
using System.Web;
using System.Web.Mvc;

public static class UrlExtensions
{
    public static string Content(this UrlHelper urlHelper, string contentPath, bool toAbsolute = false)
    {
        var path = urlHelper.Content(contentPath);
        var url = new Uri(HttpContext.Current.Request.Url, path);

        return toAbsolute ? url.AbsoluteUri : path;
    }
}

Cshtmlでの使用:

@Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true)
18
Jeff Tian

Hostまたはprotocolパラメーターが空でない場合、MVC 4の組み込みヘルパーは絶対URLを作成します。ビューで使用する拡張メソッドの例については、 こちらの回答 をご覧ください。

4
Carl G

ASP.Net Core 2.0(MVC)では、これはアクションの絶対URLを作成するために機能します。

var url = Url.Action("About", "Home", new { /*Route values here*/ }, Request.Scheme);
1
brady321

MVC 5用に、このためのヘルパークラスを作成しました...これは非常に柔軟で、コントローラーの内部にいないときにこの機能が必要な場合に特に便利です。あなたはそれをプロジェクトに直接ドロップして行くことができるはずです。

Meligyが指摘したように、鍵はプロトコルを含めることです。ここでは、httpとしてハードコーディングされているため、SSLを使用する場合は、もう少し柔軟にする必要があります。

public class AbsoluteUrlHelper
{
    /// <summary>
    /// Creates an absolute "fully qualified" url from an action, and assumes the current controller.
    /// </summary>
    /// <returns></returns>
    public static string GetAbsoluteUrl(string action, object routeValues = null)
    {
        var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
        var values = urlHelper.RequestContext.RouteData.Values;
        var controller = values["controller"].ToString();

        return GetAbsoluteUrl(action, controller, urlHelper, routeValues);
    }

    /// <summary>
    /// Creates an absolute "fully qualified" url from an action and controller.
    /// </summary>
    public static string GetAbsoluteUrl(string action, string controller, object routeValues = null)
    {
        var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

        return GetAbsoluteUrl(action, controller, urlHelper, routeValues);
    }

    /// <summary>
    /// Creates an absolute "fully qualified" url from an action and controller.
    /// </summary>
    public static string GetAbsoluteUrl(string action, string controller, UrlHelper urlHelper, object routeValues = null)
    {
        var uri = urlHelper.Action(action, controller, routeValues, "http");

        return uri;
    }
}
0
Brian MacKay