1

I want to post my json data from Xamarin.Forms application to my asp.net web api.

My Models Class

public class MyModel2
{
    public int Id { get; set; }
    public string ShopName { get; set; }
    public List<Order2> ListOrder { get; set; }
}

public class Order2
{
    public int Id { get; set; }
    public string ProductName { get; set; }
}

My Controller code is below :

public class MyModel2Controller : ApiController
{
    private MPTContext db = new MPTContext();

    // GET: api/MyModel2
    public IQueryable<MyModel2> GetMyModel2()
    {
        return db.MyModel2;
    }

    // GET: api/MyModel2/5
    [ResponseType(typeof(MyModel2))]
    public async Task<IHttpActionResult> GetMyModel2(int id)
    {
        MyModel2 myModel2 = await db.MyModel2.FindAsync(id);
        if (myModel2 == null)
        {
            return NotFound();
        }

        return Ok(myModel2);
    }

    // PUT: api/MyModel2/5
    [ResponseType(typeof(void))]
    public async Task<IHttpActionResult> PutMyModel2(int id, MyModel2 myModel2)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != myModel2.Id)
        {
            return BadRequest();
        }

        db.Entry(myModel2).State = EntityState.Modified;

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!MyModel2Exists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST: api/MyModel2
    [ResponseType(typeof(MyModel2))]
    public async Task<IHttpActionResult> PostMyModel2(MyModel2 myModel2)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.MyModel2.Add(myModel2);
        await db.SaveChangesAsync();

        return CreatedAtRoute("DefaultApi", new { id = myModel2.Id }, myModel2);
    }

    // DELETE: api/MyModel2/5
    [ResponseType(typeof(MyModel2))]
    public async Task<IHttpActionResult> DeleteMyModel2(int id)
    {
        MyModel2 myModel2 = await db.MyModel2.FindAsync(id);
        if (myModel2 == null)
        {
            return NotFound();
        }

        db.MyModel2.Remove(myModel2);
        await db.SaveChangesAsync();

        return Ok(myModel2);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool MyModel2Exists(int id)
    {
        return db.MyModel2.Count(e => e.Id == id) > 0;
    }
}

My RestService Code is below:

MyModel2 model1:

public async Task<MyModel2> SaveOrder()
{
    model1 = new MyModel2
    {
        ShopName = "MMSHop",
        ListOrder = new List<Order2>()
        {
            new Order2
            {
                ProductName = "MMPRoduct"
            }
        }
    };
    var data = JsonConvert.SerializeObject(model1);
    var content = new StringContent(data, Encoding.UTF8, "application/json");
    var result = await client.PostAsync(MainUrl, content);
    return model1;
}

My Button Event Handler is

MyModel2 OOmodel;
private async void OnOrderPlace(object sender, EventArgs e)
{
    OOmodel = await OOrest.SaveOrder();
}

When I press the button I get json data like

Json Result Image: screenshot 1

but on my asp.net web api result seems like that

Asp.net Web API result: screenshot 2 as you see ListOrder is null however in my application I am also sending its data. I also try to use postman from that i get 201 code (successful or generated) also in my Server Explorer --> Order2 Table i get poster values in Orders2 Table but not on server.

2
  • Show us your Web API controller Commented Aug 1, 2019 at 12:32
  • 1
    please check my controller i have edit my post Commented Aug 1, 2019 at 12:59

1 Answer 1

1

To force Web API to read a simple type from the request body, add the FromBody attribute to the parameter

// POST: api/MyModel2
[ResponseType(typeof(MyModel2))]
public async Task<IHttpActionResult> PostMyModel2([FromBody] MyModel2 myModel2)

then in GetMyModel2 method

// GET: api/MyModel2
public IQueryable<MyModel2> GetMyModel2()
{
  return db.MyModel2.Include(x => x.ListOrder);
}
Sign up to request clarification or add additional context in comments.

6 Comments

MyModel2 is the same for Web API and Xamarin.Forms? Did you try to debug it? What value of result after post? If you need help then add additional details, because I can't guess why "Its not working". See how to ask a question.
I try to keep model name same and different but still facing problem. Result after post is shown in the image. I also try to use postman from that i get 201 code (successful or generated) also in my Server Explorer --> Order2 Table i get poster values in Orders2 Table but not on server.
Yes, I try that and its giving the same properties as api. As i mention in my post data is also storing in ab other table name as "Order2" but its not showing in "ListOrder". I want to display data of "Order2" in "ListOrder"
ok, thanks. try this: return db.MyModel2.Incude(x => x.ListOrder) in method GetMyModel2. let me know if it works
Thanks its now showing "ListOrder" data. Thanks a lot.
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.