81 votes

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

Il s'agit probablement d'une question fictive, 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. Typiquement, elle crée une sauvegarde et renvoie le nom du fichier au contrôleur, qui envoie un email avec l'URL pour le télécharger. Cela fonctionne bien, mais je ne peux pas construire l'URL absolue à envoyer. Quelle que soit la fonction que j'utilise, j'obtiens toujours une URL relative, par exemple /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 ?

1 votes

La réponse aquí m'a aidé dans un scénario similaire. Cette réponse concerne à la fois le http/https et les numéros de port. C'est très utile car mon développement local est sur http avec un numéro de port mais la solution de production est sur https.

119voto

Meligy Points 10138

Vous pouvez le faire de la manière suivante :

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 tout simplement passer un chemin.

Mais si l'URL mène à un Controller Action 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 avez spécifié le protocol /scheme lorsque vous appelez une méthode de routage, vous obtenez une URL absolue. Je recommande celui-ci quand c'est possible mais vous disposez également de la méthode plus générique du premier exemple au cas où vous en auriez besoin.

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

Extrait de Newsletter AngularJS & Web Dev Goodies de Meligy

0 votes

Modifié : si votre Uri de demande avait un segment de requête, vous pourriez également avoir besoin d'écraser la propriété Query sur le constructeur d'Uri !

0 votes

Voici un bref résumé du poste avec toutes les options : benjii.me/2015/05/

35voto

Chris Points 14136

De l'intérieur du contrôleur :

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

1 votes

VirtualPathUtility renvoie toujours un Uri relatif dans le contrôleur MVC4

7 votes

Et combiné avec la classe Uri, c'est tout ce dont vous avez besoin. C'est un commentaire sans intérêt.

0 votes

Je ferais d'abord passer votre chemin par la méthode Url.Content(). Cette réponse échouera pour les chemins qui ne sont pas absolus (commençant par '/').

19voto

Jeff Tian Points 133

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)

0 votes

C'est génial. En fait, j'ai écrit presque exactement ce que vous avez suggéré dans votre réponse, mais je n'ai pas pensé à l'ajouter comme une surcharge à la méthode Content pour la rendre encore plus légère. Merci !

0 votes

Merci beaucoup pour cette merveilleuse solution. J'utilise la directive ng-include et j'ai eu beaucoup de problèmes à cause des chemins relatifs. La seule chose que j'ai ajoutée dans votre code est '' autour de l'url.

4voto

Carl G Points 2025

Les aides intégrées dans MVC 4 créent des URL absolues si l'une des deux conditions suivantes est remplie host o protocol sont non vides. Voir cette réponse ici avec un exemple de méthode d'extension à utiliser dans les vues.

-5voto

Keith Points 3403

Vous avez quelques options :

  • Enregistrez la valeur de HttpContext.Request.Url dans une variable statique ou membre, et utilisez-la pour transmettre le chemin d'accès complet.
  • Enregistrez le domaine de l'application dans un paramètre de l'application dans le web.config.
  • Coder en dur la valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X