it-swarm.it

Ottenere l'URL assoluto da un'azione ASP.NET MVC

Questa probabilmente è una domanda fittizia ma non riesco a trovare un'indicazione chiara. Ho una classe POCO in un'applicazione web MVC3 il cui unico scopo è gestire il backup di alcuni file nel server. Generalmente crea un backup e restituisce il nome file al controller, che invia un'email con l'URL per scaricarlo. Funziona bene, ma non posso costruire l'URL assoluto da inviare. Indipendentemente dalla funzione che utilizzo, ottengo sempre un URL relativo, come /Backup/TheFile.Zip, piuttosto che ad es. http://www.somesite.com/Backup/TheFile.Zip. Provai:

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

ma tutti restituiscono qualcosa come /Backup/SomeFile.Zip. Qualche idea?

67
Naftis

Puoi farlo nel modo seguente:

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

Invece di Url.Action() in questo esempio, puoi anche usare Url.Content(), o qualsiasi metodo di routing, o semplicemente passare un percorso.

Ma se l'URL va a un ControllerAction, c'è un modo più compatto:

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

Il trucco qui è che una volta specificato lo schema protocolquando si chiama un metodo di routing, si ottiene un URL assoluto. _/Lo raccomando quando possibile, ma nel primo esempio hai anche il modo più generico nel caso tu ne abbia bisogno.

Ne ho parlato in dettaglio qui:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

Estratto da Meligy's AngularJS & Web Dev Goodies Newsletter

104
Meligy

Dall'interno del controller:

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

Questo funziona per me:

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

Utilizzo in cshtml:

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

Gli helper incorporati in MVC 4 creano URL assoluti se i parametri Host o protocol non sono vuoti. Vedi questa risposta qui con un metodo di estensione di esempio per l'uso nelle viste.

4
Carl G

In ASP.Net Core 2.0 (MVC) questo funziona per creare un URL assoluto per un'azione.

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

Ho scritto una classe helper per questo, per MVC 5 ... È piuttosto flessibile, ed è particolarmente utile se hai bisogno di questa funzionalità quando non sei all'interno di un controller. Dovresti essere in grado di rilasciarlo direttamente in un progetto e andare.

Come ha sottolineato Meligy, la chiave è includere il protocollo. Qui ho hard coded come http, quindi se si desidera utilizzare SSL che potrebbe essere necessario un po 'più flessibile. 

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