2016-01-07 3 views
0

J'ai une page MVC ASP avec le code suivant:charge une base de fichier JS particulier sur ce que l'URL de son hébergé

<script type="text/javascript" src="https://TEST_DOMAIN.com/test.js"> </script> 
@*<script type="text/javascript" src="https://LIVE_DOMAIN.com/Live.js"> </script>*@ 

Essentiellement, je commenter ou décommenter le script que je veux utiliser si le site est en direct ou si c'est sur Test. J'adorerais être capable de faire cela de façon dynamique. Une solution, peut-être, est de savoir si elle pourrait lire l'URL actuelle et déterminer si elle est Live/Test.

mis à jour avec réponse (merci Whipdancer)

dans web.config J'ai ajouté l'url:

<add key="BundleJS" value="https://TEST_DOMAIN.com/test.js" /> 
<!--<add key="BundleJS" value="https://LIVE_DOMAIN.com/Live.js" /> 

Je vais examiner les transformations web.config suivant. Mais c'est beaucoup mieux que ce que j'avais avant.

La prochaine étape a été au cours Session_Start dans le fichier Global.asax.cs je mis l'URL à une variable d'application:

Application["BundleJS"] = System.Configuration.ConfigurationManager.AppSettings["BundleJS"]; 

Après cela, j'a été mis été en mesure d'aller au contrôleur de la vue (Astuce: dans mon cas, la vue était une mise en page, donc je suis allé au contrôleur parent). Ou après la méthode ActionResult j'ai ajouté la variable d'application au ViewBag

ViewBag.BundleJS = HttpContext.Application["BundleJS"]; 

Enfin dans la page cshtml (qui était _layout pour moi) je mets le script en

<script type="text/javascript" src="@ViewBag.BundleJS"> </script> 
+0

Cela ne ressemble pas à la vanille HTML. Quelles sont ces choses '@ *'? Quel cadre utilisez-vous? – birdoftheday

+1

That's Razor de ASP MVC –

+0

Vous devez configurer des environnements séparés tous ensemble et utiliser des variables d'environnement –

Répondre

2

Puisque vous utilisez ASP.NET MVC - vous pouvez utiliser des transformations de configuration Web pour gérer vos différents environnements.

More info on web config transformations

je puis utiliser un paramètre de configuration Web pour déterminer l'environnement approprié, qui est chargé par le monde.asax (ou possible dans mon contrôleur de vue primaire).

Vous serez alors en mesure de déterminer automatiquement l'URL appropriée en fonction de l'environnement que vous avez compilé.

in test web.config: 

<appSettings> 
    <add key="JSSource" value="https://TEST_DOMAIN.com/test.js" /> 
</appSettings> 

in release web.config: 

<appSettings> 
    <add key="JSSource" value="https://LIVE_DOMAIN.com/Live.js" /> 
</appSettings> 

à global.asax que vous pourriez faire quelque chose comme:

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static string jsUrl; 

    protected void Application_Start() 
    { 
     jsUrl = System.Configuration.ConfigurationManager.AppSettings["JSSource"]; 
    } 
} 

En vous page vous pouvez ensuite utiliser quelque chose comme ceci:

<script type="text/javascript" src="@jsUrl"> </script> 

** Je ne pense pas que cela le code fonctionnera tel quel. C'est pour vous donner une idée générale.

+0

Bonjour whipdancer, comment cela fonctionnerait-il si @jsUrl n'existe pas dans le contexte actuel de la page cshtml? – Sniipe

+0

Si '@ jsUrl' n'existe pas, cela ne fonctionnerait pas. Le point de rendre web.config conduit - de sorte que la configuration que vous utilisez (déboguer, tester, libérer, quoi que ce soit) fournira la valeur correcte dans le web.config, quand l'application démarre, elle va peupler 'jsUrl' et vous l'aurez à la vue. – whipdancer

0

Vous pouvez vérifier cette réponse : https://stackoverflow.com/a/5819693/2710681

vous pouvez tester avec la méthode de jQuery Ajax getScript mais ce qui précède est probablement mieux:

if (test) { 
    $.getScript("https://TEST_DOMAIN.com/test.js", function(data, textStatus, jqxhr) { 
     console.log(data); // Data returned 
     console.log(textStatus); // Success 
     console.log(jqxhr.status); // 200 
     console.log("Test load was performed."); 
    }); 
} else { 
    $.getScript("https://LIVE_DOMAIN.com/Live.js", function(data, textStatus, jqxhr) { 
     console.log(data); // Data returned 
     console.log(textStatus); // Success 
     console.log(jqxhr.status); // 200 
     console.log("Live load was performed."); 
    }); 
} 
0

Puisque vous utilisez rasoir, vous pouvez le faire côté serveur:

@if(isLive) 
{ 
    <script type="text/javascript" src="https://TEST_DOMAIN.com/test.js"> </script> 
} 
else 
{ 
    <script type="text/javascript" src="https://LIVE_DOMAIN.com/Live.js"> </script> 
} 

isLive est une variable qui indique si l'environnement actuel est test ou en direct. Cette solution fonctionnera côté serveur et ne polluera pas le code HTML avec plus de scripts

EDIT: Si vous ne disposez pas d'une variable d'environnement, vous pouvez passer un bool object du contrôleur à la vue (en utilisant ViewBag), la valeur true si elle est construite dans DEBUG, en utilisant preprocessor directives.

[Code]

bool isLive = true; 
#if DEBUG 
isLive = false; 
#end if; 
-1

votre instruction if pourrait être

var a = document.createElement('a'); 
a.href = url; 
var hostname = a.hostname; 

if(hostname == "yourlivewebsite.com") { 

} else { 
} 
+0

C'est incroyablement hacky. –