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

MVC中Recipe表更新视图数据填充失败,Json反序列化报错求助

解决MVC更新视图填充字段的JSON反序列化错误

先直接点出你遇到的核心问题:你报错的根源是用错了获取响应内容的方式,而且反序列化后的对象类型和视图期望的不匹配。

错误原因拆解

那个Unexpected character encountered while parsing value: S...的错误,是因为你调用了response.ToString()——这个方法返回的是HttpResponseMessage对象的字符串描述(比如StatusCode: 200, ReasonPhrase: 'OK', ...),根本不是API返回的JSON内容,Json.NET自然无法解析这种非JSON字符串。

另外,你已经通过temp变量拿到了正确的JSON数组,但你的更新视图应该是绑定单个Recipe对象,而不是IList<Recipe>列表,直接把列表传给视图也会导致字段无法正确填充。

修正后的代码

下面是修复后的CreateOrEdit方法,我加了一些健壮性判断,避免空引用或者请求失败的情况:

public ActionResult CreateOrEdit(int id = 0) 
{ 
    if (id == 0) 
    {
        return View(new Recipe()); 
    }
    else 
    { 
        HttpResponseMessage response = GlobalVariablesUpdate.clientUp.GetAsync(id.ToString()).Result; 
        
        // 先判断API请求是否成功
        if (!response.IsSuccessStatusCode)
        {
            // 可以根据需求跳回列表页或者返回错误视图
            return RedirectToAction("Index");
        }
        
        // 获取API返回的真实JSON内容(就是你之前存在temp里的内容)
        var jsonContent = response.Content.ReadAsStringAsync().Result; 
        
        // 反序列化为列表,再取第一个元素(因为你的JSON是单元素数组)
        var recipeList = JsonConvert.DeserializeObject<IList<Recipe>>(jsonContent);
        var targetRecipe = recipeList.FirstOrDefault();
        
        // 如果没找到对应ID的Recipe,也做错误处理
        if (targetRecipe == null)
        {
            return RedirectToAction("Index");
        }
        
        return View(targetRecipe); 
    } 
}

优化建议(可选)

如果可以修改你的API,建议让它根据ID返回单个Recipe对象(而不是数组),这样反序列化的代码会更简洁:

修改后API返回的JSON应该是这样的(去掉外层的数组括号):

{"id":5002,"name":"Test Recipe","recipeLink":"testlink","category1Id":7757,"category2Id":7758,"category3Id":7759,"category4Id":7760,"recipeById":1,"totalTime":30,"totalTimeUnitId":1,"activeTime":20,"activeTimeUnitId":1,"instructions":"Test Instructions","sourceKey":"Test SK","recipeBy":"TestPerson","insertedAtUtc":"2019-09-04T12:18:48.0466667","isVerified":1,"numPersons":5}

对应的反序列化代码可以简化为:

var targetRecipe = JsonConvert.DeserializeObject<Recipe>(jsonContent);

这样视图就能正确绑定单个Recipe对象的所有字段,自动填充更新表单了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:39:34