410 Stimmen

Abrufen der vollständigen URL einer Aktion in ASP.NET MVC

Gibt es eine eingebaute Möglichkeit, die vollständige URL einer Aktion zu erhalten?

Ich bin auf der Suche nach etwas wie GetFullUrl("Action", "Controller") die etwas zurückgeben würde wie http://www.fred.com/Controller/Action .

Der Grund, warum ich danach suche, ist die Vermeidung der Hardcodierung von URLs in automatisierten E-Mails, die so generiert werden, dass die URLs immer relativ zum aktuellen Standort der Website generiert werden können.

0voto

Jorge Aguirre Punkte 2722

Vielleicht bin ich einfach nur sehr, sehr pingelig, aber ich möchte Konstanten nur einmal definieren. Wenn Sie einen der oben beschriebenen Ansätze verwenden, wird Ihre Aktionskonstante mehrfach definiert.

Um dies zu vermeiden, können Sie Folgendes tun:

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

Dann erstellen Sie Ihre Controller, z.B. den 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);
    }

Dann verwenden Sie es einfach so:

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

Und aus Ihrer .cshtml (oder einem beliebigen Code)

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

Das ist definitiv viel mehr Arbeit, aber ich bin beruhigt, weil ich weiß, dass die Kompilierzeitvalidierung auf meiner Seite ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X