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

