wake-up-neo.net

Absolute URL aus einer ASP.NET-MVC-Aktion abrufen

Dies ist wahrscheinlich eine Scheinfrage, aber ich kann keine eindeutigen Hinweise finden. Ich habe eine POCO-Klasse in einer MVC3-Webanwendung, deren einziger Zweck das Verwalten der Sicherung einiger Dateien auf dem Server ist. Normalerweise erstellt er eine Sicherung und gibt den Dateinamen an den Controller zurück, der eine E-Mail mit der URL zum Herunterladen sendet. Das funktioniert gut, aber ich kann nicht die absolute URL erstellen, die gesendet werden soll. Egal welche Funktion ich verwende, ich bekomme immer eine relative URL wie /Backup/TheFile.Zip anstatt von z. http://www.somesite.com/Backup/TheFile.Zip. Ich habe es versucht:

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

aber alle geben etwas wie /Backup/SomeFile.Zip zurück. Irgendeine Idee?

67
Naftis

Sie können dies folgendermaßen tun:

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()

Anstelle von Url.Action() können Sie in diesem Beispiel auch Url.Content() oder eine beliebige Routing-Methode verwenden oder wirklich nur einen Pfad übergeben.

Wenn die URL jedoch zu einer ControllerAction geht, gibt es einen kompakteren Weg:

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

Der Trick dabei ist, dass Sie, wenn Sie beim Aufruf einer Routing-Methode das protocol-Schema angegeben haben, eine absolute URL erhalten. _/Ich empfehle dieses wenn möglich, aber Sie haben im ersten Beispiel auch den allgemeineren Weg, falls Sie es brauchen.

Ich habe hier ausführlich darüber gebloggt:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

Auszug aus Meligys AngularJS & Web Dev Goodies Newsletter

104
Meligy

Innerhalb des Controllers:

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

Das funktioniert für mich:

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;
    }
}

Verwendung in cshtml:

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

Die integrierten Hilfsprogramme in MVC 4 erstellen absolute URLs, wenn die Parameter Host oder protocol nicht leer sind. Siehe diese Antwort hier mit einer beispielhaften Erweiterungsmethode für die Verwendung in Ansichten.

4
Carl G

In ASP.Net Core 2.0 (MVC) erstellt dies eine absolute URL für eine Aktion.

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

Ich habe eine Hilfsklasse für MVC 5 geschrieben. Sie ist sehr flexibel und besonders nützlich, wenn Sie diese Funktionalität benötigen, wenn Sie sich nicht in einem Controller befinden. Sie sollten es in der Lage sein, es direkt in ein Projekt zu stecken und loszulegen.

Wie Meligy betont hat, muss das Protokoll enthalten sein. Hier habe ich es hart als http codiert, also wenn Sie SSL verwenden wollen, müssen Sie vielleicht etwas flexibler werden. 

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