2014-02-06 111 views
2

我想顯示一個加載屏幕,當用戶點擊一個按鈕來執行一個動作,因爲該動作需要10秒鐘運行。在MVC等待屏幕4

我在家裏控制器我有一個簡單的HTTP發佈:

[HttpPost] 
public ActionResult PostMethod() 
{ 
    System.Threading.Thread.Sleep(1000); 
    return View(); 
} 

在我看來,我有:

@{ 
    ViewBag.Title = "Home Page"; 
} 

@section featured { 
    <div id="divLoading" style="margin: 0px; padding: 0px; position: fixed; right: 0px; top: 0px; width: 100%; height: 100%; background-color: #666666; z-index: 30001; opacity: .8; filter: alpha(opacity=70);display:none"> 
     <p style="position: absolute; top: 30%; left: 45%; color: White;"> 
      Loading, please wait...<img src="../../Content/themes/base/images/ajax-loading.gif"> 
     </p> 
    </div> 

    <section class="featured"> 
     <div class="content-wrapper"> 
      <hgroup class="title"> 
       <h1>@ViewBag.Title.</h1> 
       <h2>@ViewBag.Message</h2> 
      </hgroup> 
     </div> 
    </section> 
} 

<button onclick="JavascriptFunction();">HTTPPost Button</button> 

<script type="text/javascript" language="javascript"> 
    function JavascriptFunction() { 
     var url = '@Url.Action("PostMethod", "Home")'; 
     $("#divLoading").show(); 
     $.post(url,function (res) { 
      $("#content-wrapper").html(res); 
      $("#divLoading").fadeOut(100); 
     }); 
    } 
</script> 

基本上Javascript函數顯示「divLoading」 DIV當用戶點擊按鈕。這工作正常。問題在於,在睡眠1秒鐘完成後,「divLoading」不會消失。所以屏幕就像加載時一樣,它應該恢復正常。

是這樣的:

return View() 

線[HTTP]正常工作?或者是這條線:

$.post(url, null, function() { 
    //$("#PID")[0].innerHTML = data; 
    $("#divLoading").hide(); 
}); 

某處它不承認視圖被返回,它不應該顯示divLoading。

+2

要調用隱藏 –

+1

我把一個斷點在返回查看你檢查,如果你的JavaScript函數在執行時()​​行,當我執行它直接爲無效格畫面。我不去javascript的功能。 ()後面的 – user3022875

+0

;放置像警報,並看看它是否出現 –

回答

1

剛剛意識到如果要調用和做Ajax請求,你很可能不希望返回查看你somethink像

 [HttpPost] 
     public ActionResult PostMethod() 
     { 
      System.Threading.Thread.Sleep(1000); 
      return Content(""); 
     } 
+0

我確實想返回一個視圖。 – user3022875

+0

視圖將不會呈現在JavaScript –

+0

有沒有一種方法,使當你返回一個視圖工作?TY – user3022875

1

所有的代碼都很好,但問題是,視圖「的PostMethod」唐不存在,所以服務器正在回答「錯誤500」,並且這樣做不會調用javascript中的函數。

1

你的代碼應該正常工作沒有任何問題。由於您在回調函數中隱藏了進度條,所以一旦收到服務器操作方法的響應,它就會被執行。

我能看到的唯一原因是行不通的,你在你的操作方法中出現了一些服務器錯誤,你得到一個500內部服務器錯誤作爲對你的ajax調用的響應。確保您的操作方法正在執行而沒有任何錯誤。你可以在你的行爲方法中加入一些斷點,看看那裏發生了什麼。

如果您沒有適合您的操作方法的正確的視圖文件,它會拋出500錯誤。

建議:我總是會換行jQuery的文件準備好功能在我的事件代碼。另外我個人更喜歡使用非物質驗證。

此外,由於它是您正在製作的ajax調用,因此您的操作方法的更好輸出是JSON結構。

[HttpPost] 
public ActionResult PostMethod() 
{ 
    try 
    { 
     System.Threading.Thread.Sleep(1000); 
     return Json(new { Status="Success"}); 
    } 
    catch(Exception ex) 
    { 
     //log error 
     return Json(new { Status="Error"}); 
    } 
} 

,你可以在你的客戶端驗證,看看是否一切罰款

$(function(){ 
    $("#SomeButtonID").click(function(e){ 
     e.preventDefault(); 
     $.post(url,function(res){ 
      if(res.Status==="Success") 
      { 
      alert("Everything went fine"); 
      //Do whatever you want here 
      } 
     }); 
    }); 
}); 

而是JSON的,如果你想返回,這不是一個大的變化。只需返回您的視圖而不是JSON。

[HttpPost] 
public ActionResult PostMethod() 
{ 
    System.Threading.Thread.Sleep(1000); 
    return View(); 
    //assuming you have the PostMethod.cshtml 
    //present in ~/Views/YourControllerName`directory 
} 

在您的回調中,您可以使用此響應(本質上是HTML標記)將其顯示在頁面的某個部分。

$.post(url,function(res){ 
    $("#YourAnotherDivId").html(res); 
    $("#divLoading").fadeOut(100);  
}); 
+0

我想返回一個不是JSON的視圖。我拿出了我真正擁有的所有代碼。在我的實際代碼中,用戶點擊按鈕後,我做了一些工作,然後返回模型到頁面,所以我想我的最後一行是返回視圖(模型);但在我的例子中,我做得更簡單。有沒有辦法使它返回一個View?TY。 – user3022875

+0

只要你有它的位置的視圖文件,它應該沒問題。檢查螢火蟲控制檯,看看發生了什麼。 – Shyju

+0

是否有可能給出一個使用返回View()而不是JSON的例子?再次感謝。 – user3022875