分页的jQuery $ .get或$ .post?

时间:2016-07-31 17:21:51

标签: jquery asp.net ajax asp.net-mvc

我正在一个公司产品列表的页面上工作,我已经创建了用于分类和搜索产品的按钮。

我的行动方法如下:

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 get,那么模型绑定器会绑定这些值吗?这种情况的首选方式是什么?

提前致谢。

3 个答案:

答案 0 :(得分:1)

分页可以归类为从服务器获取数据,因此您应该使用$.get。使用$.post也可以使用,但这并不意味着您应该使用它。它&#39重要的是要理解使用两者之间的差异 - GET vs POST in AJAX calls

如果您使用常见的MVC分页概念,例如PagedListWebGrid,并在浏览列表时通过Fiddler检查流量,您会注意到总是执行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>)))
}

答案 1 :(得分:0)

模型绑定器将绑定,但您的URL可能太长,所以我认为您应该使用post。

答案 2 :(得分:0)

您可能必须使用$.post(),例如,如果用户在搜索栏或字段中键入产品并单击按钮(或者您在更改文本时使用了keyup()) ,对操作CustomerProducts()的后期版本进行Ajax POST 调用,该版本仅用于搜索所需产品。

如果Model绑定成功,该操作将仅触及Ajax调用。要确保模型绑定正确,您必须将传递给Ajax调用的data部分中的服务器的数据与您的POST操作正在接受的ActivityViewModel进行比较。如果ActivityViewModel与您的表单数据不匹配,则可能必须根据您的搜索表单创建单独的ViewModel。

然后,您可以根据收到的Ajax调用的successfailure响应来决定要执行的操作。调试这可能会有所帮助。