AJAX Таблица обновления вызова становится нулевой - ASP.NET - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь обновить свою таблицу с помощью Ajax Call с помощью этого кода

 var customer = {};
        customer.CustomerId = row.find(".CustomerId").find("span").html();
        customer.Nome = row.find(".Nome").find("span").html();
        customer.Tipo = row.find(".Tipo").find("span").html();
        customer.NCM = row.find(".NCM").find("span").html();
        customer.Contabil = row.find(".Contabil").find("span").html();

        $.ajax({
            type: "POST",
            url: "/Home/UpdateCustomer",
            data: '{customer:' + JSON.stringify(customer) + '}',
            contentType: "application/json; charset=utf-8",
            dataType: "json"
        });
    });

Но когда я нажимаю, чтобы обновить значение, возвращается System.NullReferenceException, я не вижу, где яделаю неправильно.

Вот мой код контроллера

 public ActionResult UpdateCustomer(Customer customer)
    {
        using (CustomersEntities entities = new CustomersEntities())
        {
            Customer updatedCustomer = (from c in entities.Customers
                                        where c.CustomerId == customer.CustomerId
                                        select c).FirstOrDefault();
            updatedCustomer.Nome = customer.Nome;
            updatedCustomer.Tipo = customer.Tipo;
            updatedCustomer.NCM = customer.NCM;
            updatedCustomer.Contabil = customer.Contabil;
            entities.SaveChanges();
        }

        return new EmptyResult();
    }

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Этот обратный вызов AJAX, приведенный ниже, фактически передал строку JSON, содержащую объект JSON, что является неправильным и приводит к тому, что customer содержит нулевое значение, которое выдает NullReferenceException (настоятельно рекомендуется поставить нулевую проверку перед использованием контекста сущности EF):

$.ajax({
    type: "POST",
    url: "/Home/UpdateCustomer",
    data: '{customer:' + JSON.stringify(customer) + '}', // this is wrong 
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});

Вместо передачи строки JSON, подобной этой, просто используйте data: JSON.stringify(customer) или просто передайте весь объект напрямую с помощью data: customer и удалите параметр contentType:

$.ajax({
    type: "POST",
    url: "/Home/UpdateCustomer",
    data: customer, 
    dataType: "json",
    success: function (result) {
        // do something
    }
});

Относительно второго вопроса, который выбралданные из запроса таблицы не обновляются, это зависит от настройки автоматического слежения из EF.Если автоматическое слежение отключено, вам необходимо установить EntityState.Modified перед использованием SaveChanges():

if (customer != null)
{
    using (CustomersEntities entities = new CustomersEntities())
    {
        Customer updatedCustomer = (from c in entities.Customers
                                    where c.CustomerId == customer.CustomerId
                                    select c).FirstOrDefault();

        updatedCustomer.Nome = customer.Nome;
        updatedCustomer.Tipo = customer.Tipo;
        updatedCustomer.NCM = customer.NCM;
        updatedCustomer.Contabil = customer.Contabil;

        // if EF auto-tracking is disabled, this line is mandatory 
        entities.Entry(updatedCustomer).State = System.Data.Entity.EntityState.Modified;
        entities.SaveChanges();
    }
}

Примечания:

1) Вы можете увидеть все методыобновить существующие данные с помощью EF в этой ссылке .

2) Эта скрипка содержит образец для выполнения запроса AJAX из содержимого таблицы.

0 голосов
/ 06 декабря 2018

System.NullReferenceException обнаружил, что значение updatedCustomer или customer равно null. Вам нужно проверить, что равно NULL.

А когда вы хотите обновить объект в EF, вам нужно добавить код, подобный:

    context.Entry(existingBlog).State = EntityState.Modified;

Howerver, зачем вам Query A Entity перед обновлением? Полагаю, вы хотите сделать это:

    public ActionResult UpdateCustomer(Customer customer)
    {
      using (CustomersEntities entities = new CustomersEntities())
       {
          entities.Entry(customer).State = EntityState.Modified;
          entities.SaveChanges();
       }
       return new EmptyResult();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...