2012-02-23 13 views
11

Bir .js dosyasında Jilet C# kodu nasıl yerleştirilir?

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

ile javascript kodu bloğunu gömmek zorunda Ama Jilet kodu .js dosyada derlemek olmaz, bir .cshtml dosyadan dahil.

Bu iş nasıl yapılır? Ya da benzer bir etkiye sahip olmak için başka zarif bir yol var mı?

Teşekkür ederiz.

+1

... dinamik JavaScript oluşturmak İnsanlar korkunç acı js. JAVASCRIPT FILES STATIC olduğu için bir javascript dosyasında Razor kodunu gömmezsiniz. – Raynos

+0

Çözmeyi denediğiniz soruna bir çözüm için yardım istemek çok daha iyi olurdu. Yani, problemi detaylandırmaya başlayın, sonra çözümünüzü deneyin. Şu anda çözmeye çalıştığın yol, iyi değil. – Paul

+0

Daha genel bir çözüm bulmaya çalışırdım ya da farklı durumlar için burada defalarca sormam gerekecek. –

cevap

18

bu sorun karşısında zaman bazen .cshtml dosyasında erişilebilir .js dosyasındaki bir fonksiyonu yerine getirecek ... ille

// 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> 

Değil

İYİ seçenek, ancak eğer yapacağım Eğer

belki veri jQuery.validate.unobtrusive nasıl yaptığını sevdiği html elemanları üzerinde niteliklerini kullanan deneyebilirsiniz başka şey ...

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

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

+1, görünümde de değişkenleri/js nesnelerini ayarlamaya gidiyorum. Genelde bu, ajax yoluyla erişilmesi gereken URL'ler için geçerlidir. ' – RPM1984

+0

İkinci seçeneğinden hoşlanıyorum, biraz tuhaf ama işe yarıyor. – mdance

+0

cshtml görünümüne bir "bölüm" ekleyebilir ve şu şekilde bir değişken tanımlayabilirsiniz: "variable = @ Model.Parameter" ve bunun başlangıcında tanımladığınız js dosyasında: 'var Parametre;' ve sonra erişebilirsiniz Bu değişken js dosyasında sadece istediğiniz Parametre yazarak. – Levimatt

4

Yapamazsınız. Sen de denemelisin. Onları ayrı tut. Bu, diğer şekilde gider, ancak Unobtrusive JavaScript'a bakmalısınız. Proje boyunca uygulanan tasarım deseni harika bir fikir.

+0

Unobtrusive JavaScript'i denedim, ancak bazı durumlarda farklı öğeleri güncellemem ya da jQuery ifadesi $ ('# bla') kullanılarak alınabilecek bir “parent” öğesini güncellemeliyim. cevaba göre. Onu derinlemesine kazmamış olabilirim, ama AFAIK ihtiyacımı karşılayamıyor. –

1

ben kabul ederken ... bunu yapmak zorunda Javascript dosyalarınızda Razor'u kullanmak hakkında iki kez düşünmelisiniz, size yardımcı olabilecek bir Nuget paketi var. Buna RazorJS denir.

Paketin yazıcısı, bunun nasıl kullanılacağını açıklayan bir blog post ürününe sahiptir.

0

Neyi başarmak istediğinize bağlı olarak yararlı bir çalışma ortamı sağlayabilirim.

Bir java script dosyasında jilet ifadelerini değerlendirmenin bir yolunu bulmak için cazip davrandım. Birçok sayfada bulunan belirli bir sınıfa göndermek için jQuery tıklama olay işleyicisini eklemek istedim. Bu jQuery belgesi hazır olay işleyicisinde yapılmalıdır. Bu tıklama etkinliği bir ajax çağrısı gerçekleştirir. Uygulamanın kök seviyesinin altında kalması durumunda, bunların url'si mutlak değil, göreceli olarak uygulanmalıdır.

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

javascript kodu çoğu hala: Yani, ben bir fonksiyonu Checkit kodu sarma ve düzen görünümüne çağrı hareket ettirerek bu çözüldü

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

gibi bir şey kullanmak istedi javascript dosyası.

3

Burada Javascript'e hizmet edecek örnek bir Razor web sayfası (MVC görünümü değil, benzer olsa da). Tabii ki, Javascript dosyalarını dinamik olarak yazmak için atipik, ama yine de bir örnek. Bunu bir kez JSON verilerini ve nadiren hesaplamak ve değiştirmek için pahalı olan başka şeyler vermek istediğim bir durumda kullandım - böylece tarayıcı bunu içerebilir ve normal bir JS dosyası gibi önbelleğe alabilir. Buradaki hile sadece Response.ContentType'u ayarlamak ve daha sonra Javascript'iniz için Razor <text> etiketleri gibi bir şey kullanmaktır.

@{ 
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> 
} 
Daha sonra diğer Jilet dosyasında böylece olarak içerebilir

:

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

Ya sadece js içeren bir .cshtml dahil olacak? içeren

.csthml ebeveyn

@RenderPage("_scripts.cshtml") 

_scripts.cshtml

<script type="text/javascript"> 
alert('@Datetime.ToString()'); 
</script> 
İlgili konular