asp.net mvc - net - URL absoluta en paquete ASP
bundles asp net mvc 4 (6)
Utilizo una biblioteca jQuery para Google Maps, y depende de los scripts de Google que se carguen primero. Me gustaría poder incluir tanto en el paquete como tal:
bundles.Add(new ScriptBundle("myfoobundle").Include(
"http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places",
"~/scripts/jquery.fooplugin-{version}.js"
));
Esto no parece funcionar (lanza una excepción quejándose de la primera cadena). Y uno puede decir que esto no debería funcionar porque esa URL absoluta no debe reducirse / agruparse.
Pero el enfoque actual es una molestia, ya que necesito asegurarme de que las dependencias sean correctas, y eso sucede en diferentes lugares (la mitad del problema en el código del paquete, la otra mitad en la vista).
Sería bueno tener una solución de 1 paso como la anterior. ¿Tengo alguna opción al respecto?
ACTUALIZAR:
Para abordar los comentarios sobre el uso de un CDN como solución: si especifico bundles.UseCdn = true
no tiene ningún efecto, y todavía obtengo la excepción ¿ The URL ''http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places'' is not valid. Only application relative URLs (~/url) are allowed
The URL ''http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places'' is not valid. Only application relative URLs (~/url) are allowed
. Además, no estoy seguro de cuál es la implicación de hacerlo en primer lugar, porque ya uso el soporte CDN para jQuery, etc., por lo que no estoy seguro de cómo eso podría entrar en conflicto con mi caso de uso.
¿Ha intentado habilitar el soporte de CDN y ver si eso permite que la URL absoluta funcione?
bundles.UseCdn = true;
Basado en los tutoriales de MVC, su sintaxis es incorrecta para crear un paquete desde un CDN. Y como han dicho otros, asegúrese de tener los bundles.UseCdn = true;
conjunto de bienes. Utilizando el ejemplo en el sitio MVC , su código debe reflejar lo siguiente:
public static void RegisterBundles(BundleCollection bundles)
{
bundles.UseCdn = true; //enable CDN support
//add link to jquery on the CDN
var jqueryCdnPath = "http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places";
bundles.Add(new ScriptBundle("myfoobundle", jqueryCdnPath).Include(
"~/Scripts/jquery-{version}.js"));
}
En la actualidad, tendría que incluir una copia local del archivo jq que está dependiendo de dentro del paquete, o tendría que administrar las etiquetas de script como lo menciona. Somos conscientes de este tipo de problema de gestión de la dependencia y se encuentra en la categoría de gestión de activos que seguimos con este elemento de trabajo en Codeplex.
Intenté esto como se sugirió y no funcionó:
string googleMapsApiCDN = "http://maps.google.com/maps/api/js?sensor=false&language=en";
bundles.Add(new ScriptBundle("~/bundles/gmap3", googleMapsApiCDN).Include(
"~/Scripts/GMap3/gmap3.min.js", // GMap3 library
"~/Scripts/GMap3/mygmap3-about.js" // Pops up and configures
GMap3 on About page
));
El script mygmap3-about.js se procesó, pero el gmap3.min.js y el script CDN de google fueron excluidos .
Si es solo una cuestión de obtener la URL absoluta en el paquete, puede ir por esto.
public static class Extensions
{
public static IHtmlString RenderScript(this UrlHelper helper, params string[] paths)
{
string scripts = System.Web.Optimization.Scripts.Render(paths).ToHtmlString();
string hostName = HttpContext.Current.Request.Url.Scheme + Uri.SchemeDelimiter + HttpContext.Current.Request.Url.Authority;
string replaced = Regex.Replace(scripts, "src=/"/", "src=/"" + hostName + "/", RegexOptions.Multiline | RegexOptions.IgnoreCase);
return new HtmlString(replaced);
}
}
Básicamente, esto tomará el bahvior de Scripts.Render y luego le aplicará URL absolutas. Luego en la vista tienes que escribir
@Url.RenderScript("~/bundles/jquery")
en lugar de
@Scripts.Render("~/bundles/jquery")
Disfruta codificando !! ...
Si está utilizando una versión de System.Web.Optimization
> = 1.1.2, hay una nueva forma conveniente de anular las URL de Styles
y Scripts
. En el siguiente ejemplo, estoy tomando un CdnBaseUrl
de web.config
para usarlo como la URL base para todos los scripts y hojas de estilo:
public class BundleConfig
{
private static readonly string BaseUrl = ConfigurationManager.AppSettings["CdnBaseUrl"];
public static void RegisterBundles(BundleCollection bundles)
{
// This is the new hotness!!
Styles.DefaultTagFormat = "<link href=/"" + BaseUrl + "{0}/" rel=/"stylesheet/"/>";
Scripts.DefaultTagFormat = "<script src=/"" + BaseUrl + "{0}/"></script>";
bundles.Add(new ScriptBundle("~/bundles/js").Include(
"Your scripts here..."
));
bundles.Add(new StyleBundle("~/bundles/css").Include(
"Your css files here..."
));
}
}
Más información sobre la optimización del sitio estático (CDN)