2009-11-14 25 views
5

JQuery'nin $ .getJSON ürününü Denetleyici'den Model verilerine erişmek için kullanıyorum ve kullanıcı öğeyi ekleyip kaldırdıkça javascript'te bir JSON nesnesi oluşturmaya çalışıyorum bir liste. Tüm JS harici bir dosyada yapılır. Model verileri için sunucuya yapılan isabet, sayfa ilk yüklendikten sonra yalnızca bir kez yapılır, böylece kullanıcının seçebileceği seçeneklerin tam listesini elde edebilirim. Bundan sonra, kullanıcı istediği kadar listeyi değiştirebilir (ve JSON nesnesine uygun şekilde güncellenir) ve sonra onu saklar (DB'ye geri yazılır).ASP.NET MVC Modeli Verilerine harici Javascript dosyasından erişme

Ama benim sorunum: $ .getJSON kullanırken, Denetleyicide çağırmam gereken yöntemin kimliğe ihtiyacı vardır, böylece söz konusu özel kaynağı arayabilir ve ilgili seçenekler listesini geri alabilir o özel kaynağa. Fakat harici bir JS dosyasından, bu ID'nin Kontrolöre nasıl geçeceğini bilmiyorum. İlk başta sayfayı açan ve URL'de oturan bağlantıya yerleştirilmiştir, ancak sayfa yüklendikten sonra, bu tanıtıcıyı Kontrolöre iletmek için nasıl bir kimlik alacağımı bilmiyorum. Bunun kafa karıştırıcı olduğunu biliyorum, çünkü aşağıda kodumu bazıları yapıştırdım:

başlangıçta bir sayfayı yüklerken Kontrolör içinde

Detaylar yöntemi (yüklemek için bilmek bir RESOURCEID sürer) : In

public ActionResult Details(string resId) 
{ 
    //call base method 
    base.Details(resId, resourceType); 
    Evaluation eval = (Evaluation)this.Model; 
    ViewData.Model = eval; 
    return View("Index"); 
} 

benim dış JS dosyası, ben bu işi yapıyorum:

:
$.getJSON("/Evaluation/PopulateJournalOptions/" + id, populateJSON); 

Ve Denetleyici içinde

, ben JSON nesnesi oluşturmak için çağrılan başka bir yöntem denilen PopulateJournalOptions yazdı

Yine de, benim sorunum, sayfa yüklendiğinde, kimliğe erişemem PopulateJournalOptions'a geçmem gerekiyor. PopulateJournalOptions'a hiçbir şey iletmemeyi ve orada yeni bir nesne oluşturmayı ve (Evaluation)this.Model'a eşit olarak ayarlamayı denedim, ancak bu .Model, büyük olasılıkla JS'den çağrıldığında Denetleyicinin yeni bir örneği olduğu için boş görünüyor. Bu yüzden burada sıkışmış durumdayım. Herhangi bir fikir?

+0

aşağıda Sorunuzun yanıtını aldığınızı ve ben (Eğer iyi bir MVC kitabı almak önermek Apress'den) ve yaşam döngüsü isteğini okuyun. –

cevap

5

sayfadaki gizli alanına id koyarak ve ardından sahip düşündünüz mü:

ViewData["resouceID"] = resouceID; 

başlangıçta yükler söz konusu Görünüme koy javascript alandan kimliği okudu?

$.getJSON("/Evaluation/PopulateJournalOptions/" + $('#Id').attr('value'), populateJSON); 

Ardından, görünümde, modeliniz bir özellik olarak gerekli Id olan ile

<%= Html.Hidden("Id") %> 

+0

Bunu düşünmemiştim ve kesinlikle ilginç bir yaklaşım. Olduğu kadar kolay, hile gibi hissediyorum. Başka birine böyle mi görünüyor? –

+0

Bu yöntem hakkında ne kadar düşündüğüm, ses çıkarmaya başladığında ne kadar temiz oldu, ben de devam ettim ve uyguladık. Fakat .attr ('value') yerine .html() kullanmam gerekiyordu. Aksi halde, harika çalışıyor. Cevabınız için teşekkürler! Bir yan not olarak, bu JSON nesnesini oluşturmak için sunucuyu iki kez vurduğumu gerçekten sevmiyorum (bir kez sayfa yüklemek için ve diğeri de JSON verilerini döndürmek için Controller eylemini çağırmak üzere). Sunucuya ikinci kez vurmak yerine, JSON'u sayfa yükündeki harici bir javascript değişkenine dönüştürebilirdim. –

+0

Değeri, modelinize yerleştiremediğiniz bir sebep yoktur ve ardından görünümde bir javascript değişkenine yazabilirsiniz. Bir AJAX geri çağırma kullanmak, ilk sayfa yükünü hızlandıracaktır, ancak zamanı karşılayabiliyorsanız, doğrudan görüntüye yerleştirebilirsiniz. – tvanfosson

0

denetleyicisi koy:

<script> 
$(document).ready(function() { 
    $.getJSON("<%=Url.Action("YourActionName", "YourControllerName", new {id = ViewData["resouceID"]}) %>", populateJSON); 
}); 
</script> 
+0

Merhaba Josh, hızlı cevap için teşekkürler. Bunun ne yaptığını kısaca anlatabilir misin? Görünüşe göre ID'yi "sizin" kimliğiniz olarak vermem gerekiyor. Kodumu $ .getJSON için sağlanan sabit kodlanmış bir kimlikle test ettim ve her şey çalışıyor, bu yüzden Denetleyicimin çağrıları, geri çağrıları, yönlendirmesi, vb. Iyi çalışıyor, ancak kimliğin nasıl geçeceğini bilmiyorum. Cevabını yanlış yorumluyor olabilirim, ama hala kimliğini sağlamaya ihtiyacım var gibi görünüyor. Ayrıca, bu harici bir JS dosyasından çalışacak mı? Tekrar teşekkürler. –

+0

Daha fazla açıklamak için cevabımı düzenledim. –

+0

İstemciden sayfa adresinden kimliği almanız gerekiyorsa, sorgu eklentisine bakın: http://plugins.jquery.com/project/query-object –

İlgili konular