J'ai un .csHtml
- fichier de rasoir avec une fonction javascript qui utilise la fonction @Url.Content
C # à l'intérieur pour l'URL ajax.
Je souhaite déplacer cette fonction vers un fichier .js
référencé depuis ma vue.
Le problème est que javascript ne "connaît" pas le symbole @
et n'analyse pas le code C #.
Existe-t-il un moyen de référencer des fichiers .js
à partir de la vue avec le symbole "@"?
8 réponses
Vous pouvez utiliser des attributs HTML5 data-*
. Supposons que vous souhaitiez effectuer une action lorsqu'un élément DOM tel qu'un div est cliqué. Alors:
<div id="foo" data-url="@Url.Content("~/foobar")">Click me</div>
Puis dans votre fichier javascript séparé, vous pouvez travailler discrètement avec le DOM:
$('#foo').click(function() {
var url = $(this).data('url');
// do something with this url
});
De cette façon, vous pourriez avoir une séparation pure entre le balisage et le script sans avoir besoin de balises côté serveur dans vos fichiers javascript.
Ce n'est probablement pas la bonne approche. Considérant la séparation des préoccupations. Vous devriez avoir un data injector
dans votre classe JavaScript
et qui, dans la plupart des cas, les données sont JSON
.
Créez un fichier JS dans votre dossier script
et ajoutez cette référence à votre View
<script src="@Url.Content("~/Scripts/yourJsFile.js")" type="text/javascript"></script>
Maintenant, considérez une classe JavaScript
littérale dans votre yourJsFile.js
:
var contentSetter = {
allData: {},
loadData: function (data) {
contentSetter.allData = eval('(' + data + ')');
},
setContentA: function () {
$("#contentA").html(allData.contentAData);
},
setContentB: function () {
$("#contentB").html(allData.contentAData);
}
};
Déclarez également une classe
public class ContentData
{
public string ContentDataA { get; set }
public string ContentDataB { get; set }
}
Maintenant, à partir de votre Action
, procédez comme suit:
public ActionResult Index() {
var contentData = new ContentData();
contentData.ContentDataA = "Hello";
contentData.ContentDataB = "World";
ViewData.Add("contentData", contentData);
}
Et de votre point de vue:
<div id="contentA"></div>
<div id="contentB"></div>
<script type="text/javascript">
contentSetter.loadData('@Json.Encode((ContentData) ViewData["contentData"])');
contentSetter.setContentA();
contentSetter.setContentB();
</script>
Pour obtenir la variable @
dans votre fichier .js, vous devrez utiliser une variable globale et définir la valeur de cette variable à partir de la vue mvc qui utilise ce fichier .js.
Fichier JavaScript:
var myValue;
function myFunc() {
alert(myValue);
}
Fichier de vue MVC:
<script language="text/javascript">
myValue = @myValueFromModel;
</script>
Assurez-vous simplement que tous les appels à votre fonction se produisent APRÈS que la valeur a été définie par la vue.
J'ai récemment blogué sur ce sujet: Génération de fichiers JavaScript externes à l'aide de vues partielles de rasoir.
Ma solution consiste à utiliser un attribut personnalisé (ExternalJavaScriptFileAttribute
) qui rend une vue partielle de Razor telle quelle, puis la renvoie sans les balises <script>
environnantes. Cela en fait un fichier JavaScript externe valide.
Je pense que vous êtes obligé de mettre ce code JS dans la vue. L'analyseur Razor, pour autant que je sache, ne regardera pas les fichiers .js, donc tout ce que vous avez qui utilise @
ne fonctionnera pas. PLus, comme vous l'avez remarqué, Javascript lui-même n'aime pas ce caractère @
qui traîne sans raison, sinon, disons, dans une chaîne.
Eh bien, je viens de trouver un moteur de rasoir sur nuget qui le fait! La signification résout la syntaxe @
!
Son nom est RazorJS .
Le package Nuget
Mise à jour 2016:
Le package n'a pas été mis à jour depuis 5 ans et le lien vers le site du projet est mort. Je ne recommande plus aux gens d'utiliser cette bibliothèque.
J'habille généralement JS ayant besoin d'accéder aux propriétés du modèle, dans les fonctions, puis je passe le @something dans la vue. Par exemple
<script type="text/javascript">
function MyFunction(somethingPresentInTheView) {
alert(somethingPresentInTheView);
}
</script>
Dans la vue j'ajoute l'invocation de fonction via (juste un exemple):
<input type='button' onclick="MyFunction('@Model.PropertyNeeded')" />
Une façon de résoudre le problème est:
Ajout d'une vue partielle avec les fonctions javascript à la vue.
De cette façon, vous pouvez utiliser le symbole @
et toutes vos fonctions javascript
sont séparées de la vue.
Questions connexes
De nouvelles questions
c#
C # (prononcé "see sharp") est un langage de programmation multi-paradigme de haut niveau, typé statiquement développé par Microsoft. Le code C # cible généralement la famille d'outils et d'exécutions Microsoft .NET, notamment le .NET Framework, .NET Core et Xamarin. Utilisez cette balise pour les questions sur le code écrit en C # ou en spécification formelle de C #.