tutorial - mvc asp.net c#
Obteniendo URL absoluta de una acción MVC de ASP.NET (7)
Probablemente esta sea una pregunta ficticia, pero no puedo encontrar una indicación clara. Tengo una clase POCO en una aplicación web MVC3 cuyo único propósito es administrar la copia de seguridad de algunos archivos en el servidor. Normalmente crea una copia de seguridad y devuelve el nombre de archivo al controlador, que envía un correo electrónico con la URL para descargarlo. Esto funciona bien, pero no puedo construir la URL absoluta que se enviará. No importa qué función use, siempre obtengo una URL relativa, como /Backup/TheFile.zip , en lugar de, por ejemplo, http://www.somesite.com/Backup/TheFile.zip . Lo intenté:
VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip");
HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.zip";
Url.Content("~/Backup/SomeFile.zip");
pero todos devuelven algo como /Backup/SomeFile.zip . ¿Alguna idea?
Desde dentro del controlador:
var path = VirtualPathUtility.ToAbsolute(pathFromPoco);
var url = new Uri(Request.Url, path).AbsoluteUri
En ASP.Net Core 2.0 (MVC) esto funciona para crear una url absoluta para una acción.
var url = Url.Action("About", "Home", new { /*Route values here*/ }, Request.Scheme);
Escribí una clase de ayuda para esto, para MVC 5 ... Es bastante flexible, y es particularmente útil si necesita esta funcionalidad cuando no está dentro de un controlador. Debería poder colocarlo directamente en un proyecto y listo.
Como Meligy señaló, la clave es incluir el protocolo. Aquí lo tengo codificado como http, por lo que si desea utilizar SSL que podría ser un poco más flexible.
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;
}
}
Esto funciona para mí:
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;
}
}
Uso en cshtml:
@Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true)
Los ayudantes incorporados en MVC 4 crean URL absolutas si el host
o los parámetros del protocol
no están vacíos. Vea esta respuesta aquí con un ejemplo de método de extensión para usar en vistas.
Puedes hacerlo de la siguiente manera:
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()
En lugar de Url.Action()
en este ejemplo, también puede usar Url.Content()
, o cualquier método de enrutamiento, o simplemente pasar una ruta.
Pero si la URL va a una Action
Controller
, hay una forma más compacta:
var contactUsUriString =
Url.Action("Contact-Us", "About",
routeValues: null /* specify if needed */,
protocol: Request.Url.Scheme /* This is the trick */);
El truco aquí es que una vez que especifique el protocol
/ esquema al llamar a cualquier método de enrutamiento, obtendrá una URL absoluta. Recomiendo este cuando sea posible , pero también tiene la forma más genérica en el primer ejemplo en caso de que lo necesite.
He escrito sobre esto en detalle aquí:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/
Extraído del boletín informativo de novedades de AngularJS y Web Dev Goodies de Meligy
Tienes pocas opciones:
- Guarde el valor de HttpContext.Request.Url en una variable estática o miembro y utilícelo para pasar la ruta Completamente calificada.
- Guarde el dominio de la aplicación en una configuración de aplicación en web.config.
- Hard-code el valor.