Операция редактирования не сохраняется в БД - PullRequest
0 голосов
/ 28 ноября 2018

Я опубликовал вопрос ранее, но не получил правильных ответов, поэтому снова отправляю с некоторыми изменениями.У меня есть функция, которая принимает два параметра, ID и Даты .Когда я установил точки останова, я смог увидеть идентификаторы и даты , выбранные на странице, в качестве значений параметров.Однако после нажатия кнопки процесса ничего не происходит, то есть эти данные не сохраняются в БД.

Классы моделей:

public class Hello{

    public string ID{ get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime? Date{ get; set; }

}

Класс контроллера:

  [HttpGet]
    public ActionResult Selection(string ids, string dates)
    {
        model = new Hello();
        ExtensionDB db = new ExtensionDB();
        string[] IDS = ids.Split(',');
        string[] DATES = dates.Split(',');
        List<Hello> list = new List<Hello>();
        for (int i = 0; i < IDS.Length; i++)
        {
            if (IDS[i] != null && IDS[i] != "")
            {
                Hello item = new Hello { ID = IDS[i], Date = DateTime.Parse(DATES[i]) };
                list.Add(item);
            }
        }

        if (ModelState.IsValid)
        {
            foreach (var row in db.Table1) 
             {
                foreach (var row2 in db.Table2)
                {
                   if (row.UID== row2.CID)  // UID and CID are Foreign keys that join these two tables
                      {
                        foreach (var item in list) 
                        {
                            if (row.UID == Convert.ToInt32(item.ID))
                            {
                                row2.ReportedDate = item.Date;
                            }
                            db.SaveChanges();
                        }
                      }
                }
            }
            ViewBag.Message = "Success";
            return View(model);
        }
        else
        {
            ViewBag.Message = "Failed";
            return View(model);
        }
    }

Я добавлю класс представления, если необходимо, однако проблема здесь .. Вы также можете обратитьсяздесь: Сохранение изменений в БД MVC

1 Ответ

0 голосов
/ 28 ноября 2018

Ваш код не пытается ничего обновить.Начните с подтверждения того, что содержат данные, которые вы передаете этому вызову POST, и что вы хотите с ним делать.Похоже, что вы пытаетесь обновить даты для ряда записей.Глядя на ваш предыдущий пост (не нужно повторно публиковать другой вопрос с тем же кодом), есть несколько вещей ..

Первое: структурируйте данные, которые вы хотите передать в вызов POST, в набор простыхобъекты, содержащие идентификатор и дату.Например:

{ 
  id = rid,
  date = date
}

и добавьте их в коллекцию с именем что-то вроде «updateData», а не в два отдельных массива идентификаторов и дат.Затем в коде на стороне сервера объявите класс модели простого представления:

public class UpdateDateViewModel
{
   public int Id { get; set; }
   public DateTime Date { get; set; }
}

В вызове ajax вместо:

data: { ids: ids, dates: dates },

вам понадобится что-то вроде:

data: { updates: updateData }, 

где updateData - это ваша коллекция пар id + даты.

и использование этой модели представления в вашем методе: public ActionResult Process (обновления IList)

При условии, что данные запросаASP.Net, отправленный как Json, должен автоматически перевести эти данные для вас, хотя вам может потребоваться настроить ASP.Net для преобразования camelCase против PascalCase.В худшем случае для тестирования вы можете использовать имена свойств camelCase («id» и «date»)

Теперь, когда дело доходит до обновления данных: на стороне сервера, пожалуйста, приобретите привычку использовать значимые имена переменных,не "c", "i" и т. д. Это делает код намного проще для понимания.

public ActionResult Process(IList<UpdateDateViewModel> updates) 
{
    using (db = new DB())
    {
        //rp = new RequestProcess(); - Assuming RequestProcess is an Entity?
        //var c = rp.getStuff(); - No idea what this getStuff() method does...

        foreach(var update in updates)
        {
            var request = db.RequestProcesses.Find(update.Id);
            if (request != null)
               request.RequestDate = update.Date; // If we find a matching request, update it's date.
            else
            { // Doesn't exist, create it and add it to the DbSet.(table)
               var request = new RequestProcess { Id = update.Id, RequestDate = update.Date };
               db.RequestProcesses.Add(request);
            }
            db.SaveChanges();
        }
    }
}

Теперь это очень грубое предположение о том, что вы, возможно, пытаетесь сделать.В идеале обновления должны быть полностью отделены от дополнений в том смысле, что обновление должно касаться только существующих записей.Если он сталкивается с идентификатором, который он не может найти, он должен выдать ошибку, проигнорировать и / или вернуть пользователю статус, что что-то не так.Создание новых записей должно быть отдельным вызовом и гарантировать, что записи должным образом инициализируются с их обязательными полями.

Ваш исходный код выглядел так, как будто он получал список идентификаторов, но затем создавал новую сущность и вызывал ее "getStuff"метод, который не имеет DbContext или любого из значений из вызова POST, но затем пытается скопировать значения из этого объекта в передаваемые вами строковые параметры (которые перезаписывают строку Json). Ни один из них не обновил бысущность, которая никогда бы не обновила ваши данные.

Успокойтесь и следуйте примерам, прежде чем пытаться адаптировать их к вашим идеям.Это будет гораздо более конструктивным и менее разочаровывающим, чем написание кода, который на самом деле не имеет особого смысла, а потом удивляться, почему он не работает.Ваш исходный код имеет, вероятно, десяток или более проблем и неэффективности.Просто вставив его в стек, вы получите много запутанных комментариев, основанных на этих проблемах, которые на самом деле не помогут с первой проблемой, которую вы хотите решить.Сократите его до минимума, начните с осмысленной передачи необходимых вам данных на сервер, а затем попытайтесь использовать эти данные для обновления ваших сущностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...