ASP.NET Core中如何在Ajax成功回调绑定模型到URL Action?
问题分析与解决方案
你的代码出现500错误的核心原因有两个:
window.location.href发起的是GET请求,但ShowList方法标记了[HttpPost],ASP.NET Core会直接拒绝GET访问POST接口- 把
response(一个List<Model>对象)直接拼到URL中,会被浏览器转成[object Object],完全无法完成模型绑定
下面给出两种可行的修改方案,按需选择:
方案一:用TempData传递筛选结果(适合小数据量场景)
修改控制器代码
using System.Text.Json; [HttpPost] public IActionResult Filter(MyViewModel viewModel) { if (ModelState.IsValid) { var list = FilterLists(viewModel); // 将列表序列化后存入TempData(TempData仅支持基本类型或序列化对象) TempData["FilteredList"] = JsonSerializer.Serialize(list); // 重定向到GET类型的ShowList接口 return RedirectToAction("ShowList"); } else { return View(viewModel); } } // 改为GET接口,从TempData中读取数据 [HttpGet] public IActionResult ShowList() { if (TempData["FilteredList"] is string json) { var list = JsonSerializer.Deserialize<List<Model>>(json); return View(list); } // 无数据时返回空列表 return View(new List<Model>()); }
修改视图代码(可简化为直接表单提交)
<form asp-action="Filter" asp-controller="Controller" method="post"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <!-- 你的输入控件 --> <div class="form-group"> <button type="submit"> Filter </button> </div> </form>
如果必须保留Ajax交互:
<script> function FilterOrder() { var _url = '@Url.Action("Filter", "Controller")'; $.ajax({ url: _url, type: "POST", data: $("form").serialize(), // 直接序列化表单数据 success: function () { // 直接跳转到ShowList接口 window.location.href = '@Url.Action("ShowList", "Controller")'; }, error: function(xhr) { // 验证失败时,替换表单区域显示错误信息 $("form").replaceWith(xhr.responseText); } }); } </script>
方案二:传递筛选参数重新查询(推荐,避免TempData局限性)
这种方式不直接传递列表,而是把筛选条件传到ShowList接口,重新执行查询,更符合HTTP规范。
修改控制器代码
[HttpPost] public IActionResult Filter(MyViewModel viewModel) { if (ModelState.IsValid) { // 将筛选参数转为路由参数,重定向到GET类型的ShowList var routeValues = new RouteValueDictionary(viewModel); return RedirectToAction("ShowList", routeValues); } else { return View(viewModel); } } [HttpGet] public IActionResult ShowList(MyViewModel viewModel) { // 用传入的筛选参数重新查询数据 var list = FilterLists(viewModel); return View(list); }
修改视图代码
直接用表单提交即可,无需Ajax:
<form asp-action="Filter" asp-controller="Controller" method="post"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <!-- 你的输入控件 --> <div class="form-group"> <button type="submit"> Filter </button> </div> </form>
内容的提问来源于stack exchange,提问作者NedaM
相关产品推荐
相关产品推荐

