ASP.NET Core 2.0/Razor Pages:如何持久化NonFactors MVC6.Grid请求间数据
解决MVC6.Grid排序/筛选时的POST数据持久化与本地处理问题
先直接回应你的核心疑问,再分场景给出具体解决方案:
1. 关于POST时是否需要重新填充Parts
是的,因为HTTP是无状态协议,每次排序/筛选触发的POST请求都是全新请求,之前请求中填充的Parts属性不会自动保留。所以你必须在POST对应的Action中重新生成Parts数据。
不过可以优化这个过程,避免重复编写搜索逻辑:
- 把用户的搜索参数(比如关键词、筛选条件)存储在
TempData或Session中,POST时直接取出这些参数重新执行搜索,获取Parts。 - 或者将搜索参数和Grid数据封装到同一个ViewModel里,这样POST时Action可以直接接收参数并重新查询数据。
示例代码参考:
// 包含搜索参数和Grid数据的ViewModel public class PartsViewModel { [BindProperty] public string SearchKeyword { get; set; } [BindProperty] public List<PartModel> Parts { get; set; } = new List<PartModel>(); } // 处理GET和POST请求的Action [HttpGet] public IActionResult Parts() { return View(new PartsViewModel()); } [HttpPost] public IActionResult Parts(PartsViewModel model) { // 复用搜索参数重新获取数据 model.Parts = _partRepository.SearchParts(model.SearchKeyword); return View(model); }
2. 如何绑定到POST事件
其实MVC6.Grid默认会把排序/筛选的POST请求发送到当前页面对应的Action,你不需要额外绑定事件,只要确保你的Action支持POST请求即可(添加[HttpPost]特性,或者同时支持GET和POST)。
如果需要自定义请求目标,可以通过Grid的Action()方法指定:
@(Html.Grid(Model.Parts) // ... 其他列配置 .Action("YourActionName", "YourControllerName") )
3. 实现本地排序/筛选(无需POST)
这应该是你最理想的方案——启用MVC6.Grid的客户端模式,所有排序、筛选、分页操作都会在浏览器本地完成,不会发起任何POST请求。
只需要在Grid配置中添加.ClientSide()方法即可:
@(Html.Grid(Model.Parts) .Build(columns => { columns.Add(model => model.PartNumber).Titled("Part Number"); columns.Add(model => model.Description).Titled("Description"); columns.Add(model => model.ProductCode).Titled("Product Code"); columns.Add(model => model.Warehouse).Titled("Warehouse"); }) .Filterable() .Sortable() .Pageable(pager => { pager.RowsPerPage = 20; }) .ClientSide() // 启用客户端模式 )
注意事项:
- 客户端模式需要一次性加载所有
Parts数据到浏览器,所以如果数据量很大(比如超过1000条),可能会影响页面加载速度和性能,这种情况下还是推荐服务器端处理(即重新填充Parts的方式)。 - 确保首次加载页面时,
Parts已经包含了所有需要展示的数据,因为客户端模式下不会再向服务器请求数据。
内容的提问来源于stack exchange,提问作者ernest
相关产品推荐
相关产品推荐

