2016-07-31 127 views
1

我在一個頁面上工作,我有一個公司產品列表,並且我已經創建了用於排序和搜索產品的按鈕。

我的操作方法是這樣的:

public async Task<ActionResult> CustomerProducts(ActivityViewModel activityModel) { 
    // fetch products using web api and return partial view 
} 

我寫了ActivityViewModel

public class ActivityViewModel { 
    public string customerId { get; set; } 
    public int skip { get; set; } 
    public int noOfRecords { get; set; } 
    public DateTime? startDate { get; set; } 
    public DateTime? endDate { get; set; } 
    public string sortOrder { get; set; } 
    public string searchText { get; set; } 
    public string searchField { get; set; } 
    public int? searchProductId { get; set; } 
} 

現在我的問題是,當特定產品的用戶搜索或對其進行排序,應該調用到服務器是jQuery $ .get或$ .post

我知道傳統得到請求的區別。如果我堅持這條規則,服務器端沒有任何變化,這個請求當然可以被緩存。在這種情況下,請求應該得到。但它是我困惑的ajax場景。模型綁定在這種情況下如何工作?如果我使用ajax獲得此目的,模型綁定器會綁定這些值嗎?這種情況的首選方式是什麼?

在此先感謝。

回答

1

尋呼可以被歸類爲從服務器獲取數據,因此你應該使用$.get爲it.Using $.post也將工作,但並不意味着你應該使用it.It重要的是要了解使用兩者之間的差異 - GET vs POST in AJAX calls

如果使用普通的MVC分頁概念,如PagedListWebGrid並通過列表檢查通過提琴手交通,你頁面,你會發現,它總是一個HTTP GET。

而且,只是要考慮的事情 - 你爲什麼不使用WebGrid?。它配備了ASP.NET MVC標準,存在於System.Web.Helpers.dll,它支持分頁和排序的開箱,這裏有一個例子:

控制器:

public class Item 
{ 
    public string Description { get; set; } 
    public string Number { get; set; } 
} 

public class GridExampleController : Controller 
{ 
    public ActionResult Index() 
    { 
     List<Item> model = this.GetItems(); 
     return View(model); 
    } 

    private List<Item> GetItems() 
    { 
     var item1 = new Item { Description = "Item 1", Number = "1" }; 
     var item2 = new Item { Description = "Item 2", Number = "2" }; 
     var item3 = new Item { Description = "Item 3", Number = "3" }; 

     var item4 = new Item { Description = "Item 4", Number = "4" }; 
     var item5 = new Item { Description = "Item 5", Number = "5" }; 
     var item6 = new Item { Description = "Item 6", Number = "6" }; 

     return new List<Item> { item1, item2, item3, item4, item5, item6 }; 
    } 
} 

查看:

@model IEnumerable<MVC_jqgrid_example.Helpers.Item> 

@{ 
    Layout = null; 
    WebGrid grid = new WebGrid(Model, canPage: true, canSort: true, rowsPerPage: 3); 
} 


@if (Model.Any()) 
{ 
    @grid.GetHtml(
      columns: grid.Columns(
      grid.Column("Description", "Description", format: @<text> @item.Description</text>), 
      grid.Column("Number", "Number", format: @<text> @item.Number</text>))) 
} 
0

模型聯編程序會綁定,但是您的URL可能太長,所以我認爲您應該使用post。

+0

是的,你是對的。我嘗試使用GET,但一旦參數不再爲空,一些URL數據就開始丟失。沒有更好的方法嗎?在不違反W3C的建議(使用GET而不是POST來獲取)?如果我想緩存記錄怎麼辦? – Aneeq

0

您可能必須使用$.post(),因爲,例如,如果用戶在搜索欄或字段中鍵入產品並單擊該按鈕(或者您在文本更改時使用了keyup()),則將調用Ajax POST調用作出的行動版本CustomerProducts()應該僅用於搜索所需產品。

如果Model成功綁定,該操作只會觸發Ajax調用。爲確保模型綁定正確,您必須將傳遞給服務器的數據與您的POST操作正在接受的ActivityViewModel進行比較,該數據在Ajax調用的data部分中進行比較。如果ActivityViewModel與您的表單數據不匹配,則可能必須根據您的搜索表單創建單獨的ViewModel。

然後,您根據您收到的Ajax調用的successfailure響應決定如何處理。調試這可能會有所幫助。

+0

是的,我現在按照你提到的方式去做。它工作得很好。唯一讓我感到困惑的是,POST並不是W3C獲取數據的推薦方式(或者至少我的看法是這樣)。我只是想知道是否有更好的方法來解決這個問題(某種方式我們不需要使用POST請求)。 – Aneeq

+0

根據您的情況,其他可能的方式可能是 1.立即從數據庫中檢索所有數據,使用JSON對其進行序列化並進行Ajax調用以從此JSON文件中檢索所需的數據。 2.使用ASP.NET SignalR進行永久連接。 (可能很難安裝)。 在這兩種情況下,您都必須使用POST,因爲您必須致電服務器才能檢索搜索結果。另外通知我們,如果你找到更好的方法。 –

+0

這有點晚,但我測試了不同的分頁擴展,例如'PagedList'和'WebGrid'使用Fiddler。這些擴展不使用POST進行抓取。 GET始終用於提取數據。我還閱讀[RFC 2616](http://www.faqs.org/rfcs/rfc2616.html),其中深入解釋了GET和POST。 – Aneeq