2014-10-27 38 views
0

我執行引導typeahead.js並試圖利用像這樣一個簡單的AJAX GET請求:AJAX GET請求命中控制器,但不會去URL在瀏覽器

$("#find-company-search").typeahead({ 
    source: function (query, process) { 
     var companies = []; 
     map = {}; 

     // This is going to make an HTTP post request to the controller 
     return $.post('/Companies/GetCompanies', { query: query }, function (data) { 

      //console.log(data); 

      // Loop through and push to the array 
      $.each(data, function (i, company) { 
       console.log(company); 
       console.log(company.CompanyID); 
       // Use the Name field on the display and for the map key. 
       map[company.Name] = company; 
       companies.push(company.Name); 
      }); 

      // Process the details 
      process(companies); 
     }); 
    }, 
    updater: function (item) { 
     console.log(item); 
     console.log(map[item]); 
     console.log(map[item].CompanyID); 

     var selected = map[item].CompanyID; 

     // Put ajax code to load the company here. 
     $.ajax({ 
      url: "/companies/?companyID=" + selected, 
      success: function() { 
       alert("Success!"); 
      } 
     }); 

     return item; 
    } 
}); 

當我提出請求,它擊中以下控制器的操作方法:

public ActionResult Index() { 
     if (CurrentUser.IsCompany(User)) { 
      // We need to cast to a Company list 
      return View(new List<Company> { db.Companies.Find(CurrentUser.CompanyID(User)) }); 
     } 

     var filters = new Dictionary<string, int>(); 
     var companyID = 0; 
     Int32.TryParse(Request.Params["companyID"], out companyID); 

     filters["companyID"] = companyID; 
     filters["hasTickets"] = Convert.ToInt32(Request.Params["has-tickets"] == "on"); 
     filters["hasDevices"] = Convert.ToInt32(Request.Params["has-devices"] == "on"); 
     filters["isCustomer"] = Convert.ToInt32(Request.Params["type"] == "customer"); 
     filters["isVendor"] = Convert.ToInt32(Request.Params["type"] == "vendor"); 
     filters["isLead"] = Convert.ToInt32(Request.Params["type"] == "lead"); 

     ViewBag.Filters = filters; 

     var companies = db.Companies.Where(c => c.Hidden != true); 

     ViewBag.CompaniesForDropdown = companies.ToList(); 

     if (filters.Count(filter => filter.Value <= 0) == filters.Count()) { 
      // Return nothing if we haven't filtered. 
      return View(new List<Company>()); 
     } 

     foreach (var filter in filters.Where(filter => filter.Value > 0)) { 
      // <= 0 means false, or no selected company, so ignore those. 
      switch (filter.Key) { 
       case "companyID": 
        companies = companies.Where(c => c.CompanyID == companyID); 
        break; 
       case "hasTickets": 
        companies = companies.Where(c => c.ServiceTickets.Count > 0); 
        break; 
       case "hasDevices": 
        companies = companies.Where(c => c.Devices.Count > 0); 
        break; 
       case "isCustomer": 
        companies = 
         companies.Where(c => c.Company_CompanyType.Count(t => t.CompanyType.Name == "Customer") > 0); 
        break; 
       case "isVendor": 
        companies = 
         companies.Where(c => c.Company_CompanyType.Count(t => t.CompanyType.Name == "Vendor") > 0); 
        break; 
       case "isLead": 
        companies = companies.Where(c => c.Company_CompanyType.Count(t => t.CompanyType.Name == "Lead") > 0); 
        break; 
      } 
     } 

     return View(companies.OrderBy(c => c.Name).ToList()); 
    } 

當我提交輸入的文本我的引導預輸入,它擊中的控制器,並填充爲預期companyID變量,但頁面不執行任何操作。但是,如果我手動導航到瀏覽器中的URL(例如/ companies /?companyID = 1604),則我的所有數據都會按預期顯示。我的AJAX請求有問題嗎?

編輯:我應該指定AJAX請求是問題,那就是:

$.ajax({ 
    url: "/companies/?companyID=" + selected, 
    success: function() { 
     alert("Success!"); 
    } 
}); 
+0

你只有一個回調你的ajax請求,成功回調。如果您還提供失敗回調,您可能會發現一些有用的東西。 – 2014-10-27 16:25:47

+0

@RaphaelSerota我已經添加了一個錯誤回調,它從來沒有擊中它。但是,它顯示我的成功警報。 – mdk09 2014-10-27 16:32:38

+0

在您的成功回調中,返回的數據可以作爲參數引用。請記錄這一點,並檢查,看看你回來。另外,如Raphael所說,添加並記錄其他處理程序。 – Ngz 2014-10-27 16:32:39

回答

0

您需要導航的頁面指定的網址:

updater: function (item) { 
    var selected = map[item].CompanyID; 

    window.location.replace("/companies", "/companies/?companyID=" + selected); 
} 

編輯:改變根據Ngz的建議回答。

+1

正確,但不在成功功能中。如果只是基於公司ID進行重定向,那麼更新程序中的AJAX請求實際上毫無意義。 – Ngz 2014-10-27 17:54:04

+0

那麼,在這種情況下,他真的不需要更新功能,對嗎? – JB06 2014-10-27 18:27:58

+0

我對插件不太熟悉,但'updater'只是表示某人選擇了一個typeahead選項,所以在這種情況下,他只需要將window.location重定向到正確的端點。 [文檔](http://getbootstrap.com/2.3.2/javascript.html#typeahead) – Ngz 2014-10-27 18:37:45

0

如果您想通過重定向頁面向控制器發送請求,那麼HTTP方法GET將完全滿足您的需求。

Ajax的美麗之一是,Web應用程序可以在不干擾現有頁面的顯示和行爲的情況下異步(在後臺)向服務器發送數據和從服務器檢索數據。(via Wikipadia

爲什麼要使用Ajax調用?

就你而言,控制器中的方法返回View,這就是爲什麼當你手動點擊URL時,視圖將按預期返回。

相關問題