Dies ist wahrscheinlich eine Scheinfrage, aber ich kann keinen klaren Hinweis finden. Ich habe eine POCO-Klasse in einer MVC3-Webanwendung, deren einziger Zweck darin besteht, die Sicherung einiger Dateien auf dem Server zu verwalten. In der Regel wird ein Backup erstellt und der Dateiname an den Controller zurückgegeben, der eine E-Mail mit der URL zum Herunterladen sendet. Dies funktioniert gut, aber ich kann nicht die absolute URL erstellen, die gesendet werden soll. Unabhängig davon , welche Funktion ich verwende, erhalte ich immer eine relative URL wie /Backup/TheFile.zip und nicht z . B. http://www.somesite.com/Backup/TheFile.zip . Ich habe es versucht:
VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip");
HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.zip";
Url.Content("~/Backup/SomeFile.zip");
aber sie alle geben so etwas wie /Backup/SomeFile.zip zurück . Irgendeine Idee?
c#
asp.net-mvc
asp.net-mvc-3
Naftis
quelle
quelle
Antworten:
Sie können dies folgendermaßen tun:
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()
Anstelle
Url.Action()
dieses Beispiels können Sie auch eineUrl.Content()
beliebige Routing-Methode verwenden oder einfach nur einen Pfad übergeben.Wenn die URL jedoch zu a wechselt
Controller
Action
, gibt es einen kompakteren Weg:var contactUsUriString = Url.Action("Contact-Us", "About", routeValues: null /* specify if needed */, protocol: Request.Url.Scheme /* This is the trick */);
Der Trick dabei ist, dass
protocol
Sie eine absolute URL erhalten , sobald Sie beim Aufrufen einer Routing-Methode das / -Schema angeben . Ich empfehle diese, wenn möglich , aber Sie haben auch die allgemeinere Methode im ersten Beispiel, falls Sie sie benötigen.Ich habe hier ausführlich darüber gebloggt:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/
quelle
Aus dem Controller heraus:
var path = VirtualPathUtility.ToAbsolute(pathFromPoco); var url = new Uri(Request.Url, path).AbsoluteUri
quelle
Das funktioniert bei mir:
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; } }
Verwendung in cshtml:
@Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true)
quelle
Die in MVC 4 integrierten Helfer erstellen absolute URLs, wenn die Parameter
host
oderprotocol
nicht leer sind. Sehen Sie diese Antwort hier mit einem Beispiel Verlängerungsverfahren zur Verwendung in Aussicht.quelle
In ASP.Net Core 2.0 (MVC) erstellt dies eine absolute URL für eine Aktion.
var url = Url.Action("About", "Home", new { /*Route values here*/ }, Request.Scheme);
quelle
Ich habe dafür eine Hilfsklasse für MVC 5 geschrieben ... Sie ist ziemlich flexibel und besonders nützlich, wenn Sie diese Funktionalität benötigen, wenn Sie sich nicht in einem Controller befinden. Sie sollten es direkt in ein Projekt einfügen und loslegen können.
Wie Meligy betonte, besteht der Schlüssel darin, das Protokoll einzuschließen. Hier habe ich es fest als http codiert. Wenn Sie also SSL verwenden möchten, muss dies möglicherweise etwas flexibler werden.
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; } }
quelle
Sie haben einige Möglichkeiten:
quelle