394 votes

Obtenir l'URL complète d'une action en ASP.NET MVC

Existe-t-il un moyen intégré d'obtenir l'URL complet d'une action ?

Je cherche quelque chose comme GetFullUrl("Action", "Controller") qui renverrait quelque chose comme http://www.fred.com/Controller/Action .

Je cherche à éviter de coder en dur les URL dans les courriels automatisés qui sont générés afin que les URL puissent toujours être générées par rapport à l'emplacement actuel du site.

0 votes

0voto

Jorge Aguirre Points 369

C'est peut-être juste moi qui suis très, très pointilleux, mais j'aime ne définir les constantes qu'une seule fois. Si vous utilisez l'une des approches définies ci-dessus, votre constante d'action sera définie plusieurs fois.

Pour éviter cela, vous pouvez faire ce qui suit :

    public class Url
    {
        public string LocalUrl { get; }

        public Url(string localUrl)
        {
            LocalUrl = localUrl;
        }

        public override string ToString()
        {
            return LocalUrl;
        }
    }

    public abstract class Controller
    {
        public Url RootAction => new Url(GetUrl());

        protected abstract string Root { get; }

        public Url BuildAction(string actionName)
        {
            var localUrl = GetUrl() + "/" + actionName;
            return new Url(localUrl);
        }

        private string GetUrl()
        {
            if (Root == "")
            {
                return "";
            }

            return "/" + Root;
        }

        public override string ToString()
        {
            return GetUrl();
        }
    }

Ensuite, créez vos contrôleurs, disons par exemple le DataController :

    public static readonly DataController Data = new DataController();
    public class DataController : Controller
    {
        public const string DogAction = "dog";
        public const string CatAction = "cat";
        public const string TurtleAction = "turtle";

        protected override string Root => "data";

        public Url Dog => BuildAction(DogAction);
        public Url Cat => BuildAction(CatAction);
        public Url Turtle => BuildAction(TurtleAction);
    }

Ensuite, il suffit de l'utiliser comme ça :

    // GET: Data/Cat
    [ActionName(ControllerRoutes.DataController.CatAction)]
    public ActionResult Etisys()
    {
        return View();
    }

Et depuis votre .cshtml (ou tout autre code)

<ul>
    <li><a href="@ControllerRoutes.Data.Dog">Dog</a></li>
    <li><a href="@ControllerRoutes.Data.Cat">Cat</a></li>
</ul>

Cela représente certainement beaucoup plus de travail, mais je suis rassuré de savoir que la validation au moment de la compilation est de mon côté.

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