我有一个用户对象
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Password { get; set; }
public int Points { get; set; }
public int NumberOfAchievements { get; set; }
public int Id { get; set; }
public string Uid { get; set; }
private List<Achievement> _listOfAllAchievements;
public List<Achievement> ListOfAllChievements
{
get
{
return _listOfAllAchievements;
}
set
{
_listOfAllAchievements = value;
NumberOfAchievements = _listOfAllAchievements.Count();
}
}
}
这就是我想通过Put请求以json格式将数据发送到Web-Api的方式:
_httpClient = new HttpClient();
_httpClient.BaseAddress = _webApiUri;
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try
{
HttpResponseMessage response = await _httpClient.PutAsJsonAsync(url, user);
if (response.IsSuccessStatusCode)
{
return true;
}
return false;
}
catch (AggregateException e)
{
throw new AggregateException(e);
}
这是接收数据的控制器
UserController.cs
public void PutUser(int id, User user)
{
user.Id = id;
if (!userRepository.UpdateUser(user))
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
每次拨打PutAsJsonAsync
时,都会显示此错误消息
收藏被修改;枚举操作可能无法执行。
但是当我改变时
private List<Achievement> _listOfAllAchievements;
public List<Achievement> ListOfAllChievements { get; set; }
到
private IEnumerable<Achievement> _listOfAllAchievements;
public IEnumerable<Achievement> ListOfAllChievements { get; set; }
错误消失。
我在网上搜索过但无法找到答案,为什么我无法以json格式发送List<>
。那里有人知道这个问题的答案吗?
因为在使用IEnumerable
时,列表在发送时以正确的方式序列化(我用 Fiddler 查看),但控制器中的接收对象有一个空列表。因此在反序列化时会出现问题
我无法弄清楚原因。
我在使用Web-Api和json格式的数据方面没有经验。所以我猜这是一个愚蠢的问题,但正如我所说,我无法找到答案。
摘要
List<>
属性的对象发送到Web-Api时出现错误
IEnumerable<>
列表的数据
修改
好的,我已经缩小了错误来源。每次用户实现成就时,我都会调用一种方法来显示此方法中的 toast 通知,我将成就添加到用户的AchievementList
。
if (App.User.ListOfAllAchievements == null)
App.User.ListOfAllAchievements = new List<Achievement>();
App.User.ListOfAllAchievements.Add(achievement);
现在,当抛出上述错误时,无论出于何种原因,程序都会跳转到 toast 方法。因此,成就再次添加(当在调试模式中查看调试器崩溃时,在列表中最新添加的项目中)。我一步一步地调试它,并且在抛出错误的部分中没有单行代码调用此 toast 方法。我只在一个地方用另一个方法调用这个方法,这个调用toast方法的方法不会被调用。它就像魔术一样非常奇怪 这就是我解决错误的方法(我绝对不知道为什么这会让错误消失):
if (App.User.ListOfAllAchievements == null)
App.User.ListOfAllAchievements = new List<Achievement>();
var list = App.User.ListOfAllAchievements.ToList();
list.Add(achievement);
App.User.ListOfAllAchievements = list;
但是发送对象的反序列化仍然无法正常工作。在Web-Api控制器中接收后,ListOfAllAchievements
仍为空。