2011-08-10 22 views
0

我正在使用asp.NET mvc3的應用程序。 我創建了一個局部視圖,我在視圖中調用了這個局部視圖,這樣我就可以在不重新加載頁面的情況下更新一個div。 我使用setTimeout(但我也試過setInterval)來定義刷新時間。 問題是它不工作,它隨機刷新div,沒有遵循我設置的時間,也沒有我能理解的邏輯,有時會刷新它兩次,有時它會等待,但不會更長我設定的時間。 這是部分視圖的代碼。在視圖中,我只是調用局部視圖。SetTimeout更新MVC3中的部分視圖隨機執行

<script type="text/javascript"> 
var st; 
function updateDiv() { 
    st = null; 
    clearTimeout(st); 
    console.log("posting"); 
    $.post('@Url.Action("RefreshSelfUpdatingPartial")', function (data) { 
     $('#SelfUpdatingPartialDiv').hide().slideDown("slow").html(data); 
     //wait 15 seconds 
     st = setTimeout(updateDiv, 15000); 
    }); 
} 
updateDiv(); 
</script> 
<div id="SelfUpdatingPartialDiv"> 
test 

</div> 

回答

2

「這是局部視圖的代碼,在查看我剛剛所說的局部視圖。」

如果上述所有代碼的是在局部視圖,並不意味着該$.post()將會然後所有上述裝入<div>,導致嵌套在本身上述的第二拷貝?隨着超時運行,它將繼續在其內部嵌套越來越多的副本。

我建議你將所有上述內容移到你的主視圖中,然後局部視圖應該只返回你想在<div>(而不是JavaScript)中看到的任何文本。

(如果這不是你該語句的意思我引用請更新您的文章更清楚地在上面的代碼位於解釋,什麼$.post('@Url.Action("RefreshSelfUpdatingPartial"))實際上返回。)

(另外,像亞歷克斯說,不要在將它傳遞給clearTimeout()之前,請將您的st變量設置爲null - 雖然我認爲您可以刪除這兩行,因爲您不需要在已經觸發後清除超時。)

+0

我只是實現了這個邏輯: http://stackoverflow.com/questions/5866326/updatepanel-in-razor-mvc-3/5893922#5893922 要im在MVC3中補充一個「UpdatePanel」。 – Attila

+1

好吧,但是說(本質上)「我從別處複製了這段代碼」實際上並沒有解決我在第一段中提到的問題,特別是因爲你已經說過它不起作用。換句話說,當你的'.post()'回調執行'data'參數中實際返回的內容嗎?請使用'console.log(data);'找出並找回我。 – nnnnnn

+0

好現在我明白你在問我什麼, 我使用了console.log(data),它返回了我在第一篇文章中發佈的所有確切代碼,也許這是問題所在?但它只是刷新分區爲什麼它應該以嵌套的方式複製自己? – Attila