2012-02-23 16 views
11

devono incorporare javascript blocco di codice conCome incorporare il codice Razor C# in un file .js?

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

ma il codice del rasoio non viene compilato in un file .js, incluso da un file .cshtml.

Come fare questo lavoro? O c'è un altro modo elegante per avere un effetto simile?

Grazie.

+1

... Le persone che generano in modo dinamico JavaScript soffrono terribilmente. Non si incorpora il codice Razor in un file javascript perché i file JAVASCRIPT SONO STATICI. – Raynos

+0

Sarebbe molto meglio chiedere aiuto su una soluzione al problema che stai cercando di risolvere. Quindi, inizia con il dettaglio del problema, quindi la tua soluzione tentata. Il modo in cui stai attualmente cercando di risolverlo, beh, non va bene. – Paul

+0

Vorrei provare a trovare una soluzione più generale altrimenti avrei bisogno di chiedere qui molte volte per situazioni diverse. –

risposta

18

Quando affronto questo problema a volte mi fornirà una funzione nel file .js che è accessibile nel file .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> 
Non

necessariamente l'opzione migliore, ma lo farà se quello che dovete fare è ...

L'altra cosa che si potrebbe forse provare utilizza attributi dei dati sui vostri elementi HTML come il modo jQuery.validate.unobtrusive fa ...

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

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

+1, vado anche con l'impostazione di variabili/oggetti js nella vista. Comunemente questo è il caso per gli URL che devono essere accessibili tramite Ajax. Per esempio ' ' – RPM1984

+0

Mi piace la sua seconda opzione. È un po 'strano, ma funziona. – mdance

+0

È possibile aggiungere una "sezione" nella vista cshtml e definire una variabile come: 'variable = @ Model.Parameter'. E nel file js definito all'inizio:' var Parameter; 'e quindi è possibile accedere questa variabile nel file js sta semplicemente digitando il parametro che desideri. – Levimatt

4

Non è possibile. Né dovresti nemmeno provarci. Tienili separati. Questo vale per il contrario, ma dovresti esaminare Unobtrusive JavaScript. Quel modello di design applicato in tutto il progetto è una grande idea.

+0

Ho provato JavaScript non intrusivo, ma in alcune circostanze avrei bisogno di aggiornare diversi elementi o aggiornare un elemento 'parent' che potrebbe essere recuperato usando un'istruzione jQuery $ ('# bla'). Parent(), o semplicemente agisci in modo diverso in base alla risposta. Forse non l'ho scavato in profondità, ma AFAIK non può soddisfare il mio bisogno. –

1

Mentre sono d'accordo che dovresti pensare due volte a usare Razor nei tuoi file Javascript, c'è un pacchetto Nuget che può aiutarti. Si chiama RazorJS.

L'autore del pacchetto ha uno blog post su di esso, che spiega come usarlo.

0

Forse posso fornire un utile work-around, a seconda di ciò che si desidera realizzare.

Sono stato tentato di trovare un modo per valutare le espressioni del rasoio in un file di script java. Ho voluto allegare un gestore di eventi click jQuery per inviarlo con una classe specifica che si trova su molte pagine. Questo dovrebbe essere fatto in un gestore di eventi pronto per jQuery. Questo evento click eseguirà una chiamata Ajax.

L'URL di questi deve essere relativo all'applicazione, non assoluto, nel caso in cui l'applicazione risieda al di sotto del livello radice. Così, ho voluto usare qualcosa come

$(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 
     }); 
    }); 
}); 

Ho risolto questo avvolgendo il codice in una funzione Checkit e spostando la chiamata alla visualizzazione layout:

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

maggior parte del codice JavaScript è ancora in un file javascript.

3

Ecco una pagina Web di Razor di esempio (non una vista MVC, anche se sarebbe simile) che servirà Javascript. Certo, è atipico scrivere dinamicamente i file Javascript, ma ecco un esempio comunque. L'ho usato una volta in un caso in cui desideravo fornire dati JSON e altre cose che erano costose da calcolare e modificare raramente, in modo che il browser potesse includerlo e archiviarlo come un normale file JS. Il trucco qui è solo per impostare il Response.ContentType e quindi utilizzare qualcosa come i tag Razor <text> per il tuo 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> 
} 

Si potrebbe quindi includere come così nel tuo altro file Razor:

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

E che dire tra cui una .cshtml che contiene solo js?

genitore .csthml

@RenderPage("_scripts.cshtml") 

_scripts.cshtml che contiene js

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