asp.net-mvc - mvc - tag helpers asp net core
¿Cómo encuentro la url absoluta de una acción en ASP.NET MVC? (9)
env: dotnet core version 1.0.4
Url.Action("Join",null, null,Context.Request.IsHttps?"https":"http");
Necesito hacer algo como esto:
<script type="text/javascript">
token_url = "http://example.com/your_token_url";
</script>
Estoy usando la versión Beta de MVC, pero no puedo averiguar cómo obtener la url absoluta de una acción. Me gustaría hacer algo como esto:
<%= Url.AbsoluteAction("Action","Controller")) %>
¿Hay un método de ayuda o página para esto?
El mismo resultado, pero un poco más limpio (sin concatenación de cadenas / formato):
public static Uri GetBaseUrl(this UrlHelper url)
{
Uri contextUri = new Uri(url.RequestContext.HttpContext.Request.Url, url.RequestContext.HttpContext.Request.RawUrl);
UriBuilder realmUri = new UriBuilder(contextUri) { Path = url.RequestContext.HttpContext.Request.ApplicationPath, Query = null, Fragment = null };
return realmUri.Uri;
}
public static string ActionAbsolute(this UrlHelper url, string actionName, string controllerName)
{
return new Uri(GetBaseUrl(url), url.Action(actionName, controllerName)).AbsoluteUri;
}
Extender el UrlHelper
namespace System.Web.Mvc
{
public static class HtmlExtensions
{
public static string AbsoluteAction(this UrlHelper url, string action, string controller)
{
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
string absoluteAction = string.Format(
"{0}://{1}{2}",
requestUrl.Scheme,
requestUrl.Authority,
url.Action(action, controller));
return absoluteAction;
}
}
}
Entonces llamalo asi
<%= Url.AbsoluteAction("Dashboard", "Account")%>
EDITAR - ANOTACIONES DE RESARTADOR
El comentario más popular sobre la respuesta aceptada es This answer is the better one, this way Resharper can still validate that the Action and Controller exists.
Así que aquí hay un ejemplo de cómo podría obtener el mismo comportamiento.
using JetBrains.Annotations
namespace System.Web.Mvc
{
public static class HtmlExtensions
{
public static string AbsoluteAction(
this UrlHelper url,
[AspMvcAction]
string action,
[AspMvcController]
string controller)
{
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
string absoluteAction = string.Format(
"{0}://{1}{2}",
requestUrl.Scheme,
requestUrl.Authority,
url.Action(action, controller));
return absoluteAction;
}
}
}
Información de apoyo:
Haga clic here para obtener más información, pero esencialmente no hay necesidad de métodos de extensión. Ya está cocido, pero no de una manera muy intuitiva.
Url.Action("Action", null, null, Request.Url.Scheme);
La respuesta completa con argumentos sería:
var url = Url.Action("ActionName", "ControllerName", new { id = "arg_value" }, Request.Url.Scheme);
y eso producirá una url absoluta
No estoy seguro de si hay una forma integrada de hacerlo, pero podrías lanzar tu propio método HtmlHelper.
Algo como lo siguiente
namespace System.Web.Mvc
{
public static class HtmlExtensions
{
public static string AbsoluteAction(this HtmlHelper html, string actionUrl)
{
Uri requestUrl = html.ViewContext.HttpContext.Request.Url;
string absoluteAction = string.Format("{0}://{1}{2}",
requestUrl.Scheme,
requestUrl.Authority,
actionUrl);
return absoluteAction;
}
}
}
Entonces llamalo asi
<%= Html.AbsoluteAction(Url.Action("Dashboard", "Account"))%> »
HTHs, Charles
Tal vez esto (?):
<%=
Request.Url.GetLeftPart(UriPartial.Authority) +
Url.Action("Action1", "Controller2", new {param1="bla", param2="blabla" })
%>
Usando la respuesta de @Charlino como guía, se me ocurrió esto.
La documentación de ASP.NET MVC para UrlHelper muestra que Url.Action devolverá una URL completa si se pasan un nombre de host y un protocolo. Creé estos ayudantes para forzar que se proporcionen el nombre de host y el protocolo. Las sobrecargas múltiples reflejan las sobrecargas para Url.Action:
using System.Web.Routing;
namespace System.Web.Mvc {
public static class HtmlExtensions {
public static string AbsoluteAction(this UrlHelper url, string actionName) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, null, (RouteValueDictionary)null,
requestUrl.Scheme, null);
}
public static string AbsoluteAction(this UrlHelper url, string actionName,
object routeValues) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, null, new RouteValueDictionary(routeValues),
requestUrl.Scheme, null);
}
public static string AbsoluteAction(this UrlHelper url, string actionName,
RouteValueDictionary routeValues) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, null, routeValues, requestUrl.Scheme, null);
}
public static string AbsoluteAction(this UrlHelper url, string actionName,
string controllerName) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, controllerName, (RouteValueDictionary)null,
requestUrl.Scheme, null);
}
public static string AbsoluteAction(this UrlHelper url, string actionName,
string controllerName,
object routeValues) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, controllerName,
new RouteValueDictionary(routeValues), requestUrl.Scheme,
null);
}
public static string AbsoluteAction(this UrlHelper url, string actionName,
string controllerName,
RouteValueDictionary routeValues) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, controllerName, routeValues, requestUrl.Scheme,
null);
}
public static string AbsoluteAction(this UrlHelper url, string actionName,
string controllerName, object routeValues,
string protocol) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, controllerName,
new RouteValueDictionary(routeValues), protocol, null);
}
}
}
<%= Url.Action("About", "Home", null, Request.Url.Scheme) %>
<%= Url.RouteUrl("Default", new { Action = "About" }, Request.Url.Scheme) %>