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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:08:26