Ajax调用始终返回空对象,控制器参数绑定失败求助
我帮你排查下几个关键问题,这应该就是你拿不到数据、进不了if(goat != null)分支的原因:
1. AJAX的datatype拼写错误+返回类型不匹配
你写的datatype是小写t,jQuery的正确参数名是驼峰式的dataType(T大写),而且你的控制器返回的是Json,但你把dataType设为了"html",这会导致jQuery解析返回值时出错,甚至直接触发error回调。
2. 最核心问题:AJAX没有传递实际的动物名称
你在AJAX的data里硬编码写了name: 'name',这相当于每次都给控制器传字符串"name",而不是按钮上存储的真实动物名称!按钮的data-rel属性里明明存了item.Name,但你根本没把这个值取出来传给后端。
3. Success回调里的this上下文错误
在AJAX的success函数里,this已经不是你点击的那个按钮元素了,直接用$(this)会找不到目标元素,需要提前把按钮对象保存下来。
修正后的完整代码:
1. 修正后的AJAX代码
$(document).ready(function () { $(".milkmilk").click(function () { // 提前保存当前点击的按钮对象,避免上下文丢失 var $currentBtn = $(this); // 从按钮的data-rel属性里获取真实的动物名称 var targetName = $currentBtn.data('rel'); $.ajax({ type: "POST", url: '@Url.Action("GoatMilk", "User")', dataType: "json", // 修正拼写,匹配控制器返回的Json类型 data: { name: targetName }, // 传递实际的动物名称 success: function (data) { // 使用提前保存的按钮对象操作DOM $currentBtn.closest('[data-rel]').html(data); }, error: function (xhr, status, error) { // 增加错误日志,方便调试 console.log("请求错误详情:", error); alert("error!"); } }); }); });
2. 优化后的控制器代码(增加调试+友好返回)
public ActionResult GoatMilk(string name) { // 调试用:查看是否接收到前端传递的name值 System.Diagnostics.Debug.WriteLine("前端传递的name:" + name); var rep = new GoatRepository(); var goat = rep.GetAnimal(name); if(goat != null) { var model = FarmFactory.CreateAnimalModel<GoatViewModel>(goat) as GoatViewModel; model.Milk = rep.MilkProduction(goat); _MyEchoFarmDB.Update(goat); var rek = new FarmRepository(); var deposit = rek.GetDeposit(name); deposit.Milk = goat.Milk; db.Update(deposit); return Json(model.Milk, JsonRequestBehavior.AllowGet); } // 当找不到山羊时,返回错误信息而非View,方便前端处理 return Json(new { success = false, message = "未找到对应的山羊" }, JsonRequestBehavior.AllowGet); }
3. 修正HTML结构(循环内不要重复生成tbody)
<table> <tbody> @foreach (var item in Model) { <tr> <td> <button class="milkmilk" data-rel="@item.Name">MILK</button> </td> </tr> } </tbody> </table>
这些修正后,前端就能正确把按钮对应的动物名称传给控制器,你应该就能进入if(goat != null)的分支了。
内容的提问来源于stack exchange,提问作者Poldro
相关产品推荐
相关产品推荐

