You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中如何在Ajax成功回调绑定模型到URL Action?

问题分析与解决方案

你的代码出现500错误的核心原因有两个:

  1. window.location.href 发起的是GET请求,但ShowList方法标记了[HttpPost],ASP.NET Core会直接拒绝GET访问POST接口
  2. 把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:10:29