我正在一个公司产品列表的页面上工作,我已经创建了用于分类和搜索产品的按钮。
我的行动方法如下:
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,那么模型绑定器会绑定这些值吗?这种情况的首选方式是什么?
提前致谢。
答案 0 :(得分:1)
分页可以归类为从服务器获取数据,因此您应该使用$.get
。使用$.post
也可以使用,但这并不意味着您应该使用它。它&#39重要的是要理解使用两者之间的差异 - GET vs POST in AJAX calls。
如果您使用常见的MVC分页概念,例如PagedList
或WebGrid
,并在浏览列表时通过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调用的success
或failure
响应来决定要执行的操作。调试这可能会有所帮助。