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.

620voto

Paddy Punkte 32391

Es gibt eine Überladung von Url.Action, die Ihr gewünschtes Protokoll (z.B. http, https) als Argument nimmt - wenn Sie dieses angeben, erhalten Sie eine voll qualifizierte URL.

Hier ist ein Beispiel, das das Protokoll der aktuellen Anfrage in einer Aktionsmethode verwendet:

var fullUrl = this.Url.Action("Edit", "Posts", new { id = 5 }, this.Request.Url.Scheme);

HtmlHelper (@Html) hat auch eine Überladung der ActionLink-Methode, die Sie in Razor verwenden können, um ein Ankerelement zu erstellen, aber es erfordert auch die Parameter hostName und fragment. Daher würde ich mich wieder für die Verwendung von @Url.Action entscheiden:

<span>
  Copy
  <a href='@Url.Action("About", "Home", null, Request.Url.Scheme)'>this link</a> 
  and post it anywhere on the internet!
</span>

142voto

Marius Schulz Punkte 15158

Wie Paddy schon sagte: wenn Sie eine Überladung von UrlHelper.Action() die das zu verwendende Protokoll explizit angibt, wird die generierte URL absolut und vollständig qualifiziert sein, anstatt relativ zu sein.

Ich habe einen Blogbeitrag mit dem Titel Wie man absolute Aktions-URLs mit der Klasse UrlHelper erstellt in dem ich vorschlage, aus Gründen der Lesbarkeit eine eigene Erweiterungsmethode zu schreiben:

/// <summary>
/// Generates a fully qualified URL to an action method by using
/// the specified action name, controller name and route values.
/// </summary>
/// <param name="url">The URL helper.</param>
/// <param name="actionName">The name of the action method.</param>
/// <param name="controllerName">The name of the controller.</param>
/// <param name="routeValues">The route values.</param>
/// <returns>The absolute URL.</returns>
public static string AbsoluteAction(this UrlHelper url,
    string actionName, string controllerName, object routeValues = null)
{
    string scheme = url.RequestContext.HttpContext.Request.Url.Scheme;

    return url.Action(actionName, controllerName, routeValues, scheme);
}

Sie können es dann einfach so in Ihrer Ansicht verwenden:

@Url.AbsoluteAction("Action", "Controller")

4voto

Salman Zahid Punkte 308

Das müssen Sie tun.

@Url.Action(action,controller, null, Request.Url.Scheme)

2voto

Matas Vaitkevicius Punkte 53532

Diese Frage ist spezifisch für ASP.NET, aber ich bin sicher, dass einige von Ihnen profitieren von System agnostic Javascript, die in vielen Situationen von Vorteil ist.

UPDATE: Die Art und Weise, wie die URL außerhalb der Seite selbst gebildet wird, ist in den obigen Antworten gut beschrieben.

Oder Sie könnten einen Einzeiler wie den folgenden machen:

new UrlHelper(actionExecutingContext.RequestContext).Action(
    "SessionTimeout", "Home", 
    new {area = string.Empty}, 
    actionExecutingContext.Request.Url!= null? 
    actionExecutingContext.Request.Url.Scheme : "http"
);

vom Filter oder:

new UrlHelper(this.Request.RequestContext).Action(
    "Details", 
    "Journey", 
    new { area = productType }, 
    this.Request.Url!= null? this.Request.Url.Scheme : "http"
);

Allerdings braucht man oft die URL der aktuellen Seite, für diese Fälle mit Html.Action und die Angabe des Namens und des Controllers der Seite, auf der man sich befindet, erscheint mir unangenehm. In solchen Fällen ziehe ich es vor, stattdessen JavaScript zu verwenden. Dies ist besonders gut in Systemen, die halb umgeschrieben MVT halb Web-Formen halb vb-Skript halb Gott weiß was sind - und um URL der aktuellen Seite muss man jedes Mal eine andere Methode verwenden.

Eine Möglichkeit ist die Verwendung von JavaScript zum Abrufen der URL window.location.href eine andere - document.URL

1voto

Matt D Punkte 3041

Ich hatte ein Problem mit diesem, mein Server lief hinter einem Load Balancer. Der Load Balancer beendete die SSL/TLS-Verbindung. Er leitete dann die Anfrage über http an die Webserver weiter.

Bei Verwendung der Methode Url.Action() mit Request.Url.Schema wurde immer wieder eine http-URL erstellt, in meinem Fall, um einen Link in einer automatisierten E-Mail zu erstellen (was meinem PenTester nicht gefiel).

Ich habe vielleicht ein wenig geschummelt, aber es ist genau das, was ich brauchte, um eine https-URL zu erzwingen:

<a href="@Url.Action("Action", "Controller", new { id = Model.Id }, "https")">Click Here</a>

Ich verwende eigentlich eine web.config AppSetting, so dass ich http verwenden können, wenn Debuggen lokal, aber alle Test- und prod-Umgebungen verwenden Transformation, um den https-Wert festgelegt.

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