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

ASP.NET MVC中Controller方法被调用两次第二次ID为Null如何解决

问题原因及解决方案

1. 方法被调用两次、第二次ID为Null的问题

根本原因

两次请求都是代码主动触发的:

  • 第一次是点击按钮触发的AJAX请求,手动传入了正确的ID参数,所以值符合预期
  • 第二次是AJAX请求成功后执行的window.location.href = '/TrainingType/ListCoach',这行代码会让浏览器直接跳转访问该地址,没有携带任何ID参数,所以第二次请求的ID为Null。

修复方案

根据业务需求二选一即可:

  • 如果需求是点击按钮后跳转到ListCoach页面,完全不需要使用AJAX,直接修改a标签代码即可:
<a class="btn btn-primary" href="@Url.Action("ListCoach","TrainingType",new {id=item.Id})" name="link">Go to anywhere</a>

删除对应的JS点击事件代码即可,写法更简单性能也更好。

  • 如果确实需要保留AJAX请求,要么跳转时拼接ID参数:
success: function (data) {
    console.log(data);
    // 跳转时携带ID参数
    window.location.href = '/TrainingType/ListCoach?id=' + data;
    return data;
}

要么取消跳转逻辑,把AJAX返回的视图内容直接渲染到当前页面的指定容器中,比如:

success: function (data) {
    // 假设存在id为contentContainer的容器用来放返回的视图内容
    $('#contentContainer').html(data);
}

额外优化点

  • Controller中参数是int id,属于值类型,默认不可能为Null,你写的if(id!=null)判断永远为真,建议要么改成可空类型int? id,要么判断id>0再执行业务逻辑。
  • 循环生成的元素不要用重复的id="textButton",id全局唯一,重复会导致JS选择器异常,改成class即可。
  • a标签点击事件中可以增加e.preventDefault()避免默认跳转行为,代码更健壮。

2. 返回JsonResult无法进入视图的问题

原因

JsonResult的作用是直接返回纯JSON字符串,不会触发MVC的视图渲染流程,所以自然不会加载ListCoach对应的视图页面。

能否直接返回Json给视图

分场景处理:

  • 如果你需要前端JS拿到JSON数据做页面渲染,完全可以这么做:AJAX请求拿到返回的JSON后,自己在前端拼接DOM元素渲染即可,不需要跳转页面。
  • 如果你需要返回渲染完成的视图页面,就不能用JsonResult,还是要返回ActionResult调用View()方法。如果需要把数据传给视图内的JS使用,可以在视图中把Model转成JSON格式:
<script>
    var coachList = @Html.Raw(Json.Encode(Model));
    // 直接在JS中使用coachList变量
</script>

内容的提问来源于stack exchange,提问作者Boris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:15:04