尝试使用List<>发送对象时出错属性为Web-Api

时间:2015-11-18 11:16:23

标签: c# json asp.net-web-api

我有一个用户对象

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时出现错误    
  •    
  •       为什么在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仍为空。

    0 个答案:

    没有答案