2013-11-05 48 views
1

對於ASP來說很新MVC我可以在ASP MVC中取消一個控制器請求嗎?

我有一個用戶可以選擇的菜單選項列表。每個菜單選項都會根據MVC體系結構觸發一個控制器。

但不幸的是,這些控制器中的一些需要一些時間來執行才能做出可見的更改。因爲大數據需要綁定到一個網格。因此,所有的時間瀏覽器掛起(顯示加載)。

如果用戶在費時的菜單選項之後選擇了一個可以輕鬆加載的選項,則會出現最糟糕的情況。

有人可以幫助如何解除一個控制器的行動請求,如果另一個進來? 現在它是所有用戶選擇動作的總和

例如:如果用戶選擇菜單1並在該菜單2之後。我的Menu1控制器操作需要一些時間來執行。到那時用戶點擊Menu2,如果第一次點擊,輕鬆加載。但是由於Menu2被點擊,用戶必須等待很長時間。

+0

您應該使用AJAX的要求去做,一旦時間過長,終止Ajax請求。儘管服務器端仍然會完成請求。而且,即使使用Ajax,在Action中使用耗時的過程也會鎖定用戶打開另一個Action,這是因爲同一個會話一次被鎖定爲一個請求。我的建議是禁用ASP.NET會話並實現您自己的會話 – lostincomputer2

+0

我可以在ASP.Net會話中有多個請求嗎 –

回答

1

這有點老,但我會盡力回答,因爲我最近遇到了這個問題。如果您使用的是MVC 5,則其他請求可以取消。訣竅是使用異步控制器操作並添加CancellationToken參數。

public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken) 
{ 
    List<ReportItem> items; 
    using (ApplicationDbContext context = new ApplicationDbContext()) 
    { 
     items = await context.ReportItems.ToListAsync(cancellationToken); 
    } 
    return View(items); 
} 

當用戶導航到另一個頁面時,請求被取消。 MVC將通知取消標記該請求已被取消。只要您還像上面那樣將取消標記傳遞給異步數據訪問方法,查詢將被取消,服務器將立即停止處理請求。

我在這裏把一個完整的解釋:http://www.davepaquette.com/archive/2015/07/19/cancelling-long-running-queries-in-asp-net-mvc-and-web-api.aspx

+0

在asp中有沒有這樣做的方法。 Net mvc4與.net4? –

+0

如何當用戶發送更具體的請求時,如何從客戶端觸發取消而不僅僅是導航? –

+0

@ChrisHayes在這種情況下,您將通過調用每個單獨請求的中止方法來取消請求。 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort –

相關問題