c#
  • jquery
  • asp.net-mvc-4
  • razor
  • 2013-08-07 43 views 1 likes 
    1

    我有這個頁面,在這裏我選擇從下拉列表中的項目,以及一個Ajax調用沿着選定的參數傳遞到一個新的動作在我的控制器,就像這樣:爲什麼我的操作不能返回視圖?

    function select(e) { 
        var unit = $("#unitList").data("kendoDropDownList").value(); 
        var url = '@Url.Content("~/Reports/UnitRunReport/")'; 
    
        $.ajax({ 
         url: url, 
         data: { selectedUnit: unit }, 
         type: 'GET', 
         dataType: 'json', 
         success: function (data) { 
          // 
         }, 
         error: function() { 
          // 
         } 
        }); 
    } 
    

    這裏是我的控制器:

    public class ReportsController : BaseController 
    { 
        public ReportsViewModel Model { get; set; } 
        // 
        // GET: /Reports/ 
    
        public ActionResult Index() 
        { 
         Model = new ReportsViewModel 
            { 
             Units = UnitClient.GetListOfUnits(true, "") 
            }; 
    
         return View(Model); 
        } 
    
        [HttpGet] 
        public ActionResult UnitRunReport(string selectedUnit) 
        { 
         var unit = Convert.ToInt32(selectedUnit); 
         Model = new ReportsViewModel 
            { 
             UnitRuns = RunClient.GetRunListForUnit(unit) 
            }; 
    
         return View(Model); 
        } 
    } 
    

    我必須爲兩個操作(Index和UnitRunReport)分開視圖。調試時,它將正確的參數傳遞給UnitRunReport操作,並在return View(Model)語句中移動。有人能解釋爲什麼我沒有重定向到Index頁面的新UnitRunReport視圖嗎?

    回答

    2

    你在ajax電話。 ajax調用不會重定向頁面。

    重定向到獲取方法:

    window.location = "@Url.Content("~/Reports/UnitRunReport")?selectedunit=" + $("#unitList").data("kendoDropDownList").value(); 
    
    0

    因爲你正在做一個Ajax調用操作方法,這樣的觀點將在這裏的數據參數返回:function (data)

    它不會重定向瀏覽器。

    1

    ,因爲你正在使用AJAX調用你是不是重定向。根據定義,這意味着該頁面不會改變。 ajax調用的結果(在這種情況下,由UnitRunReport方法返回的ActionResult)將返回到您提供給jQuery的成功委託的數據參數中。

    您可以通過傳遞一個成功委託來交換頁面上的html(或者頁面中的元素和調用結果)來解決此問題,例如如果您有相關的ID dataElement的元素,然後在你使用這個成功回調

    success: function (data) { 
         $("#dataElement").html(data); 
        } 
    

    注意你正在返回的HTML從你的控制器的方法了。您可能想要返回一個json模型,並使用類似敲除的庫將其綁定到您的頁面。

    如果你想實際重定向到頁面而不是像你目前正在做的那樣調用ajax,那麼當用戶更改下拉列表中的選擇時,需要設置window.location屬性。這將導致整個頁面重新加載並呈現UnitRunReport返回到新頁面的視圖。

    1

    首先你要做一個ajax請求,它不會重定向頁面,而只是從動作讀取數據。

    其次,你正在請求json結果,它會給你json數據。

    1

    它看起來像你試圖獲取JSON數據而不是視圖,通常是HTML。所以你的控制器應該如下所示。

    public class HomeController : Controller 
    { 
        public ReportsViewModel Model { get; set; } 
        // 
        // GET: /Reports/ 
    
        public ActionResult Index() 
        { 
         Model = new ReportsViewModel 
         { 
          Units = UnitClient.GetListOfUnits(true, "") 
         }; 
    
         return View(Model); 
        } 
    
        [HttpGet] 
        public ActionResult UnitRunReport(string selectedUnit) 
        { 
         var unit = Convert.ToInt32(selectedUnit); 
         Model = new ReportsViewModel 
         { 
          UnitRuns = RunClient.GetRunListForUnit(unit) 
         }; 
    
         return this.Json(Model, JsonRequestBehavior.AllowGet); 
        } 
    } 
    

    您可以通過執行console.log來測試JavaScript中返回的數據。此外,而不是做Url.Content嘗試Url.Action,因爲您的路線可能沒有正確設置和url.action將確保正確的路線將生成。

    function select(e) { 
        var unit = $("#unitList").data("kendoDropDownList").value(); 
        var url = '@Url.Action("UnitRunReport", new { controller = "Home" })'; 
        $.ajax({ 
         url: url, 
         data: { selectedUnit: unit }, 
         type: 'GET', 
         dataType: 'json', 
         success: function (data) { 
          console.log(data); 
          // do something with the data coming back 
         }, 
         error: function() { 
          // show some sort of message 
         } 
        }); 
    } 
    

    要查看控制檯只是打F12讓你的工具,在你喜歡的瀏覽器彈出(我仍然是一個螢火蟲風扇)。只需要注意將任何與console.log一起部署到生產環境中,這些日子通常並不重要,因爲人們擁有較新的瀏覽器,但您仍然可能會遇到那些會滑倒並遇到問題的一兩個問題。如果你想保持代碼在那裏,並投入生產,你可以啓動腳本頁面投入生產覆蓋的console.log

    <script type="text/javascript"> 
        console = { 
         log: function (s) { 
          // empty method to override console 
         } 
        }; 
    </script> 
    

    假如把它放在你的Site.Master和發展過程中刪除它,你可以保留所有的console.log文件,在製作時他們會停止顯示。

    相關問題