0

I am trying to built a simple API using ASP.NET Core MVC.

I have successfully built an api with get, post and edit and delete functions. However the Postman JSON raw post results in Null value however if I use form data, it works perfectly.

I want to send the data as raw json, any idea what am I doing wrong?

My model

[Table("continous value monitoring")]
public class Continous
{
        [Key]
        public int UserID { get; set; }
        public float Value { get; set; }
        public string ReadingType { get; set; }
}

Data Context:

public class DataContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionBuilder)
    {
            var builder = new ConfigurationBuilder()
                                                 .SetBasePath(Directory.GetCurrentDirectory())
                                                 .AddJsonFile("appsettings.json");

            var configuration = builder.Build();
            optionBuilder.UseMySql(configuration
                ["ConnectionString:DefaultConnection"]);
        }

        public DbSet<Continous> Continous { get; set; }
}

Controller

[Produces("application/json")]
[Route("continous")]
public class ContinousController : Controller
{
    private DataContext db = new DataContext();

    [Route("")]
    [Route("index")]
    [Route("~/")]
    public IActionResult Index()
    {
        ViewBag.Continous = db.Continous.ToList();
        return View();
    }

    [HttpGet]
    [Route("Add")]
    public IActionResult Add()
    {
         return View("Add");
    }

    [HttpPost]
    [Route("Add")]
    public IActionResult Add(Continous continous)
    {
        db.Continous.Add(continous);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    [HttpGet]
    [Route("Delete/{UserID}")]
    public IActionResult Delete(int UserID)
    {
        db.Continous.Remove(db.Continous.Find(UserID));
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    [HttpGet]
    [Route("edit/{UserID}")]
    public IActionResult Edit(int UserID)
    {
        return View("Edit", db.Continous.Find(UserID));
    }

    [HttpPost]
    [Route("edit/{UserID}")]
    public IActionResult Edit(int UserID, Continous continous)
    {
        db.Entry(continous).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
}

View File corresponding to Add

<!DOCTYPE html>
<html>
<head>
    <meta name="viewpoint" content="width=device-width" />
    <title>Add</title>    
</head>
<body>

    <form method="post" asp-controller="continous" asp-action="add">
        <table>
            <tr>
                <td>UserID</td>
                <td>
                    <input type="number" asp-for="UserID" min="0" required="required" />
                </td>
            </tr>
            <tr>
                <td>Value</td>
                <td>
                    <input type="number" asp-for="Value" min="0" required="required" />
                </td>
            </tr>
            <tr>
                <td>Reading Type</td>
                <td>
                    <input type="text" asp-for="ReadingType" required="required" />
                </td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td>
                    <input type="submit" value="Save" />
                </td>
            </tr>




        </table>
    </form>
</body>
</html>

1 Answer 1

5

You need to add [FromBody] attribute if you want accept Json raw request data.

[HttpPost]
[Route("Add")]
public IActionResult Add([FromBody]Continous continous)
{
        
    db.Continous.Add(continous);
    db.SaveChanges();

    return RedirectToAction("Index");
}

enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you! I have tried previously with the [frombody] but it turns out that I was not handling the Postman correctly and using "UserID":"1" instead of "UserID":1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.