2009-07-28 19 views
33

Son zamanlarda ASP.NET MVC ve Javascript/jQuery ile çok çalışıyorum ve her zaman geçmek zorunda olduğum bir yöne gidiyorum. javascript’im için bazı dinamik değerler. senaryom, şu sayfaya olduğunda, böyle bir şey yaptık:Asp.net-mvc'den javascript'e veri aktarmak için en iyi yöntemler

var isEditable = <%=ViewData["editable"]%> 

Bu & hızlı, kolay ve sadece HTML içine bir değer enjekte ediyorum gibidir nasıl gibi. Ama bu kokuyor. Gerçekten çok kötü. Ve Visual Studio'nun intellisense ve kod biçimlendirmesini kırar, böylece betikleri okumayı ve anlamayı zorlaştırır.

Başka çözüm bozulmamış senaryoyu tutar olarak bu muhtemelen çok daha iyidir

<input type="hidden" id="editable" value="<%=ViewData["editable"]%>" /> 
var isEditable = $("#editable").attr("value"); 

... gizli alanına benim veri aktarmak ve bu JavaScript başvurusuna sahip olacağını bana oluştu ve onu harici bir .js dosyasına taşımama izin verir. Fakat bu çözümle ilgili bir şey de ideal değil. Yoksa sadece ben mi?

Herkes, komut dosyalarınıza veri aktarmak için en iyi çözümleri & önerebilir mi? Eğer senaryolarım önce denetleyicilerimden en çok güvendiğim senaryolara bürünürse yanlış yola mı geçtim?

+1

Modelden veriyi, AJAX ile denetleyicide bir çeşit veri deposuna "çekme" ne dersin? – Janie

+1

Bence AJAX'a atıfta bulunduğum vakaların türünde aşırı bir hata olacaktı… Komut dosyam genellikle denetleyici/modelden birkaç veri biti bilmemeli (ilk sayfa yürütme sırasında mevcut olan veriler) başka bir ağ çağrısı yapmak için bir denetleyici geri biraz fazla gibi görünüyor. –

cevap

11

bazen bir JSON seri aracılığıyla sayfaya bir yapılandırma nesnesi yazarak sayfalarımda veri aktarmak: Eğer toJSON yöntemini kendiniz yazmanız gerekir

var pageConfig = <%= ServerConfig.ToJson() %>; 

. Bu, sayfa durumunu güzel bir şekilde korur, böylece sunucu değerlerini enjekte ettiğiniz tek bir yer vardır. Buradaki her şey saf javascript. senin örnekte, daha sonra yapabileceği:

var isEditable = pageConfig.isEditable; 

bile harici js dosyasında, eğer pageConfig geneldir. Bu durumda, yine de, doğru bir şekilde adlandırmalısınız: MY_APP.pageConfig belki.

+0

Bu, işitilebilirliği etkilemiyor mu?En az her sayfada GET farklı bir sayfa (farklı yapılandırma) döndürebilir. Proxy sunucularında önbellekler açısından düşünürken, şimdi her kullanıcı için o sayfanın farklı bir sürümüne sahip olacaksınız. Bu bir endişe mi? –

+0

Bu ilgi çekici bir seçenektir, ancak bu ServerConfig sınıfını nasıl uyguladığınızı tam olarak anladığımdan emin değilim. Gerçekten de her sayfa GET farklı bir veri kümesi döndürebilir, bu yüzden pageConfig sonuçta her sayfanın ViewData'dan ayarlanması gerekmiyor mu? Ne olursa olsun, diğer önerileriniz kesinlikle deneyeceğim/düşüneceğim bir şey (Json ve global js değişkeni) - teşekkürler! –

+0

@Kurt - evet, onu ViewData'dan (belki anonim bir tip olarak) oluşturmalısınız. ViewData'dan kurtulabileceğiniz anlamına gelmedim, ancak sayfadaki sunucu verilerini enjekte ettiğiniz yer sayısını sınırlandırabilirsiniz. –

0

Bu bilgiyi bir şekilde veya başka bir şekilde enjekte edeceksiniz. Ve IMO, ilk örneğiniz ikincisinden gerçekten farklı değil.

Başka bir çözüm, bir seçenek nesnesini kabul edecek bir JS sınıfına (veya prototipine?) Sahip olmaktır. İtiraf etmene rağmen, verdiğiniz örneklerden gerçekten farklı değil. Ama yine de, belki de bu şekilde gitmek istersiniz.

$(function() { 
    myClass.init({ isEditable: <%=ViewData["editable"]%>, 
     another: '<%=ViewData["another"]%>' }); 
}); 
0

Bence @ çağdaş iyi bir noktaya işaret ediyor, ancak sunucu tarafını da kontrol etmeyi unutmayın. Bir alanı "salt okunur" olarak ayarlarsanız, kullanıcının bu bayrağı değiştirmesini, salt okunur bir alanı değiştirmesini ve göndermesini engelleyecek hiçbir şey yoktur.

0

Ajax'ın tüm işi, yük yükünü eşzamansız olarak yüklemektir. Eğer Ajax'ın işini yapıyorsanız (bilgiyi yükleyip bir değişkende saklıyorsanız), bu güçten çekilir. Neden JQuery'yi denemiyorsunuz ve içeriği Ajax ya da içeriği dinamik olarak yüklemek için Get fonksiyonlarını kullanmıyorsunuz. Sayfanızın daha hızlı yüklenmesine yardımcı olur.

İlgili konular