2012-02-23 3 views
11

devez intégrer javascript bloc de code avecComment intégrer le code Razor C# dans un fichier .js?

<script type='text/javascript'> 
    ... 
</script> 

Mais le code Razor ne compilera pas dans un fichier .js, inclus dans un fichier .cshtml.

Comment faire pour que cela fonctionne? Ou y a-t-il une autre manière élégante d'avoir un effet similaire?

Merci.

+1

... Les gens qui génèrent dynamiquement JavaScript souffrent horriblement. Vous n'incorporerez pas de code Razor dans un fichier javascript car les fichiers JAVASCRIPT sont STATIQUES. – Raynos

+0

Vous seriez beaucoup mieux de demander de l'aide sur une solution au problème que vous essayez de résoudre. Commencez par détailler le problème, puis la solution que vous avez essayée. La façon dont vous essayez actuellement de le résoudre, eh bien, n'est pas bonne. – Paul

+0

J'essaierais de trouver une solution plus générale sinon je devrais demander ici plusieurs fois pour des situations différentes. –

Répondre

18

Quand je fais face à ce problème, parfois, je fournirai une fonction dans le fichier .js qui est accessible dans le fichier .cshtml ...

// someFile.js 
var myFunction = function(options){ 
    // do stuff with options 
}; 

// razorFile.cshtml 
<script> 
    window.myFunction = new myFunction(@model.Stuff); 
    // If you need a whole model serialized then use... 
    window.myFunction = new myFunction(@Html.Raw(Json.Encode(model))); 
</script> 

Pas nécessairement la meilleure option, mais il fera si vous devez le faire ...

L'autre chose que vous pourriez peut-être essayer utilise les attributs des données sur vos éléments HTML comme la façon dont jQuery.validate.unobtrusive fait ...

//someFile.js 
var options = $("#stuff").data('stuff'); 

// razorFile.cshtml 
<input type="hidden" id="stuff" data-stuff="@model.Stuff" /> 
+0

+1, j'y vais aussi en définissant des objets variables/js dans la vue. C'est généralement le cas pour les URL qui doivent être accessibles via ajax. Par exemple ' ' – RPM1984

+0

J'aime sa deuxième option.Il est un peu étrange, mais cela fonctionne. – mdance

+0

Vous pouvez ajouter une "section" dans la vue cshtml et définir une variable comme: 'variable = @ Model.Parameter' Et dans le fichier js vous le définissez au début de' var Parameter; 'et ensuite vous pouvez accéder cette variable dans le fichier js en tapant simplement le paramètre que vous voulez. – Levimatt

4

Vous ne pouvez pas. Vous ne devriez même pas essayer. Gardez-les séparés. Cela vaut pour l'inverse, mais vous devriez regarder dans Unobtrusive JavaScript. Ce modèle de conception appliqué tout au long du projet est une excellente idée.

+0

J'ai essayé le JavaScript discret, mais dans certains cas je devrais mettre à jour différents éléments, ou mettre à jour un élément 'parent' qui pourrait être récupéré en utilisant une instruction jQuery $ ('# bla'). selon la réponse. Je n'ai peut-être pas creusé profondément dedans, mais AFAIK il ne peut pas répondre à mon besoin. –

1

Même si je suis d'accord que vous devriez réfléchir à deux fois sur l'utilisation de Razor dans vos fichiers Javascript, il y a un paquet Nuget qui peut vous aider. Ça s'appelle RazorJS. L'auteur du paquet a un blog post à ce sujet, qui explique comment l'utiliser.

0

Peut-être que je peux fournir une solution de rechange utile, en fonction de ce que vous souhaitez accomplir.

J'ai été tenté de trouver un moyen d'évaluer les expressions de rasoir dans un fichier de script java. Je voulais associer un gestionnaire d'événements jQuery click à des soumissions avec une classe spécifique que l'on trouve sur plusieurs pages. Cela devrait être fait dans un gestionnaire d'événement prêt pour le document jQuery. Cet événement de clic effectuerait un appel ajax. L'adresse URL de ceux-ci devrait être l'application relative, et non absolue, dans le cas où l'application vit au-dessous du niveau de la racine. Donc, je voulais utiliser quelque chose comme

$(document).ready(function() { 
    $('input[type="submit"].checkit)').click(function (e) { 
     $.ajax({ 
      type: 'POST', 
      url: '@Url.Content("~/checkit")', //Razor expression here 
      dataType: 'json', 
      success: function (data) { 
       if (!data) { 
        e.preventDefault(); 
        handleResponse(data); 
       } 
      }, 
      data: null, 
      async: false 
     }); 
    }); 
}); 

Je résolu ce problème en enveloppant le code dans une fonction Checkit et déplacer l'appel à la vue de la mise en page:

 $(document).ready(function() { 
      Checkit('@Url.Content("~/checkit")'); 
     }); 

La plupart du code javascript est encore en un fichier javascript.

3

Voici un exemple de page Web Razor (pas une vue MVC, bien que similaire) qui va servir de Javascript. Bien sûr, il est atypique d'écrire dynamiquement des fichiers Javascript, mais voici néanmoins un exemple. Je l'ai utilisé une fois dans le cas où je voulais fournir des données JSON et d'autres choses qui étaient chères à calculer et à modifier rarement - donc le navigateur pouvait l'inclure et le mettre en cache comme un fichier JS normal. L'astuce ici est juste pour définir le Response.ContentType et ensuite utiliser quelque chose comme les balises Razor <text> pour votre javascript.

@{ 
Response.ContentType = "text/javascript"; 
Response.Cache.SetLastModified(System.Diagnostics.Process.GetCurrentProcess().StartTime); 
Response.Cache.SetExpires(System.DateTime.Now.Date.AddHours(28)); 
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public); 
<text> 
var someJavaScriptData = @someSortOfObjectConvertedToJSON; 
function something(whatever){ 
} 
</text> 
} 

Vous pouvez ensuite l'inclure comme si dans l'autre fichier Razor:

<script src="MyRazorJavascriptFile.cshtml"></script> 
0

Et qu'en incluant un .cshtml qui ne contient que js?

parent .csthml

@RenderPage("_scripts.cshtml") 

_scripts.cshtml qui contient js

<script type="text/javascript"> 
alert('@Datetime.ToString()'); 
</script> 
Questions connexes