2011-04-02 23 views
7

content numaralı arabayı güncelleyen ve yüklendikten sonra onSuccess işlevini çalıştıran bazı bağlantılar içeren bir menüm var. Ben url /home am ve indirme işlemi başarıyla div değişiklikleri bağlantısını tıklarsanızAjax isteğinden sonra URL nasıl değiştirilir?

<li>@Ajax.ActionLink("Home", "Index", "home")</li> 
<li>@Ajax.ActionLink("Download", "Index", "download")</li> 

. Sorun, URL'nin değişmemiş olmasıdır.

İstenen URL'yi nasıl alabilirim, böylece başarılı isteklerde history.pushState numaralı telefonu arayabilirim?

cevap

6

this question (How to get request url in a jQuery $.get/ajax request)'dan this.url ile alabildiğimi öğrendim. MDC window.history itibaren

Ben sözdizimi bulundu ve MDC Manipulating the browser history dan ben history.state ile mevcut durumunu (gerçi Chrome üzerinde çalışmak için görünmüyor) alabilirsiniz bulundu ve pushState çağrılırken sadece stateObject üzerinde 640K karakter gönderebilir keşfetti ya da bir istisna atar.

başarılı ajax istekleri için Benim şu anki yöntemdir: Ben stateObject üzerindeki tüm sonuçları depolamak.Bu temel test için

OnSuccess: function(html, status, xhr){ 
    var requestedUrl = this.url.replace(/[&?]X-Requested-With=XMLHttpRequest/i, ""); 

    // if the url is the same, replace the state 
    if (window.location.href == requestedUrl) 
    { 
     history.replaceState({html:html}, document.title, requestedUrl); 
    } 
    else 
    { 
     history.pushState({html:html}, document.title, requestedUrl); 
    } 
}, 

, bu bir istisna atar, yerine URL'yi ayarlar yapabilmek için yeni bir istek. Bu daha önce olduğu gibi, yeni bir talepte gerekmez sayfasını geri

$(window).bind("popstate", function (e) { 
    var state = e.originalEvent.state; 
    $("#body").html(state.html); 
}); 

Benim popstate olaydır.

2

Bunu gerçekleştirmeyi düşünebilmemin tek yolu, bağlantıların tıklama olayını işlemek için jQuery'yi kullanmaktır. Böylece, bağlantılarınıza aşağıdaki gibi bir sınıf özniteliği ekleyebilirsiniz; Tıklama olay eklemek

@Ajax.ActionLink("Home", "Index", "home", new { @class = "menuLinks" }) 

;

$(".menuLinks").click(function() { 
    history.pushState(stateObj, $(this).html, $(this).attr("href")); 
} 

Değil pushState imzası ile çok bildik ama pushState geçirmek için geçerli bir url olarak çalışacak 'bir' etiketinin href kullanarak inanıyoruz.

İlgili konular