2016-07-31 64 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