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
相关产品推荐
相关产品推荐

