Pushing multiple entries and saving them in database through AngularJS

angularjs asp.net-mvc entity-framework-6

Question

I am stuck saving multiple rows I pushed in "$scope.arr" to my SQL Server database. I have my code below and it works fine but when I click on "Save To DB" button after adding/pushing some entries by pressing "Add Person" button, it passes a row with null values to SQL Server database. Please guide me where I am doing the mistake:

I also heard about using angular.forEach loop but I am confused using that too.

I have my model class "TestModel.cs" here:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TestProj.Models
{
    public class TestModel
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

My MVC Controller named TestController's Add method here:

[HttpPost]
public string AddPerson(TestModel test)
            using (TestContext db = new TestContext())
            {
                if (test != null)
                {
                    db.TestModels.Add(test);
                    db.SaveChanges();
                    return "Successful";
                }
                else
                {
                    return "Failed";
                }
            }
        }

My AngularJS script here:

var app = angular.module("TestApp", []);

app.controller("TestCtrl", function ($scope, TestService) {

    $scope.arr = [];

    $scope.addPerson = function () {
        var myobj = {
            FirstName: $scope.firstname,
            LastName: $scope.lastname
        }
        $scope.arr.push(myobj);
    };

    $scope.savePerson = function () {
        var TestData = TestService.AddPer($scope.arr);
        TestData.then(function (msg) {
            alert(msg.data);
        }, function () {
            alert('Error In Adding Person');
        });
    };

});

app.service("TestService", function ($http) {

    this.AddPer = function (person) {
        var response = $http({
            method: "post",
            url: "/Test/AddPerson",
            data: JSON.stringify(person),
            dataType: "json",
        });
        console.log(response);
        return response;
    }
});

And my Index.cshtml file here:

<div ng-controller="TestCtrl">
    <form>
        FirstName: <input class="form-control" ng-model="firstname" /><br />
        LastName: <input class="form-control" ng-model="lastname" /><br />
        <button class="btn btn-success" ng-click="addPerson()">Add Person</button>
        <button class="btn btn-success" ng-click="savePerson()">Save To DB</button>

        <table class="table table-bordered">
            <tr>
                <th>S. No</th>
                <th>First Name</th>
                <th>Last Name</th>
            </tr>
            <tr ng-repeat="a in arr">
                <td>{{$index+1}}</td>
                <td>{{a.FirstName}}</td>
                <td>{{a.LastName}}</td>
            </tr>
        </table>
    </form>
</div>

<script src="~/Scripts/MyAngular/Module.js"></script>

Your help will be appreciated. Thanks!

1
1
4/20/2016 9:19:36 PM

Accepted Answer

Then server side action should expect collection of TestModel, you could us List there. If you [FromBody] before parameter, you don't need to stringify data before posting it to server.

Code

[HttpPost]
public string AddPerson([FromBody] List<TestModel> test)
  using(TestContext db = new TestContext()) {
    test.forEach(t=> {
      if (t != null) {
          db.TestModels.Add(t);
          return "Successful";
      } else {
          return "Failed";
      }
    });
    db.SaveChanges(); //save context at the end, when no error occurs
  }
}
1
4/20/2016 9:38:42 PM

Popular Answer

The problem was in my Server Side Code i.e, my C# controller, this method worked:

[HttpPost]
        public void AddPerson(List<TestModel> test)
        {
            using (TestContext db = new TestContext())
            {
                foreach(var t in test) 
                {
                    if (t != null)
                    {
                        db.TestModels.Add(t);
                        Console.WriteLine("Success");
                    }
                }
                db.SaveChanges(); //save context at the end, when no error occurs
            }
        }


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow