Search code examples
asp.net-web-api2nullreferenceexceptionhttp-put

NullObjectReference when performing a PUT in Web Api


I am trying to update a variable inside a class "Conversation" put the parameter objects are not binding for some reason. I don't know why not. As a result I am getting this error:

"Object reference not set to an instance of an object.",

Controller:

[HttpPut]
public async Task<IHttpActionResult> AddMember(string key, User user)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    Conversation conver = await db.Conversations.FindAsync(key);     //THIS IS NULL

    if (conver == null)
    {
        return NotFound();      //METHOD IS ENDING HERE
    }

    conver.Members.Add(user);   //THIS IS NULL

    db.Entry(conver).State = EntityState.Modified;
    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        return NotFound();
    }

     return StatusCode(HttpStatusCode.NoContent);
}

Model class User:

namespace AcademicAssistant.Models
{
    [DataContract]
    public class User
    {
        [Key]
        [DataMember]
        public string Email { get; set; }

        [DataMember]
        public string Password { get; set; }

        [DataMember]
        public bool Admin { get; set; }

    }
}

Model Class Conversation:

[DataContract]
public class Conversation
{
    [Key]
    [DataMember]
    public string Key { get; set; }

    [DataMember]
    public string ConversationName { get; set; }

    [DataMember]
    public string Administrator { get; set; }

    [DataMember]
    public virtual ICollection<User> Members { get; set; }

    [DataMember]
    public virtual ICollection<Message> Messages { get; set; }

}

I am testing this in Postman like this:

ROUTE = api/Conversations/AddMember/?key="1LM4"

JSON = {"user": { "Email": "56@56.com", "Password" : "Passw-1", "Admin" : true } }


Solution

  • SOLUTION:

    The Route should have been

    api/Conversations/AddMember/?key=1LM4

    and the JSON formatted like this:

    {
        "Email": "56@56.com",
        "Password" : "Passw-1",
        "Admin" : true
    }