web-dev-qa-db-fra.com

Obtenir une URL absolue d'une action ASP.NET MVC

C'est probablement une question factice mais je ne trouve pas d'indication claire. J'ai une classe POCO dans une application Web MVC3 dont le seul but est de gérer la sauvegarde de certains fichiers sur le serveur. Généralement, il crée une sauvegarde et renvoie le nom de fichier au contrôleur, qui envoie un courrier électronique avec l'URL pour le télécharger. Cela fonctionne bien, mais je ne peux pas créer l'URL absolue à envoyer. Peu importe la fonction que j'utilise, j'obtiens toujours une URL relative, telle que /Backup/TheFile.Zip, plutôt que par exemple. http://www.somesite.com/Backup/TheFile.Zip. J'ai essayé:

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

mais ils retournent tous quelque chose comme /Backup/SomeFile.Zip. Une idée?

67
Naftis

Vous pouvez le faire comme suit:

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

Au lieu de Url.Action() dans cet exemple, vous pouvez également utiliser Url.Content(), ou n’importe quelle méthode de routage, ou bien simplement passer un chemin.

Mais si l'URL va à une ControllerAction, il existe un moyen plus compact:

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

L'astuce ici est qu'une fois que vous spécifiez la variable protocollorsque vous appelez une méthode de routage, vous obtenez une URL absolue. _/Je recommande celui-ci lorsque cela est possible, mais vous avez également la manière la plus générique dans le premier exemple au cas où vous en auriez besoin.

J'ai blogué à ce sujet en détail ici:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

Extrait de Bulletin Meligy’s AngularJS & Web Dev Goodies

104
Meligy

Depuis le contrôleur:

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

Cela fonctionne pour moi:

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

Utilisation en cshtml:

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

Les utilitaires intégrés dans MVC 4 créent des URL absolues si les paramètres Host ou protocol ne sont pas vides. Voir cette réponse ici avec un exemple de méthode d'extension à utiliser dans les vues.

4
Carl G

Dans ASP.Net Core 2.0 (MVC), cela crée une URL absolue pour une action.

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

J'ai écrit une classe d'assistance pour cela, pour MVC 5 ... C'est assez flexible, et est particulièrement utile si vous avez besoin de cette fonctionnalité lorsque vous n'êtes pas dans un contrôleur. Vous devriez pouvoir le déposer directement dans un projet et y aller.

Comme Meligy l’a fait remarquer, l’essentiel est d’inclure le protocole. Ici, je l'ai codé en dur en tant que http, donc si vous voulez utiliser SSL, vous devrez peut-être devenir un peu plus flexible. 

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