编辑操作未保存到数据库

时间:2018-11-27 22:03:56

标签: asp.net-mvc entity-framework

我较早发布了问题,但未收到任何正确的答复,因此再次进行了一些编辑。我有一个接受两个参数的功能, ID 日期。设置断点后,可以看到在页面上选择的 Id和Date 作为参数值。但是,单击“处理”按钮后,什么也没有发生,这意味着该数据不会保存到数据库中。

模型类:

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);
        }
    }

如果需要,我将添加视图类,但是问题出在这里。您也可以在这里引用它:Saving changes to the DB MVC

1 个答案:

答案 0 :(得分:0)

您的代码不会尝试更新任何内容。首先确认要传递给此POST调用的数据包含什么,以及您要如何处理。您似乎想做的就是更新许多记录的日期。看您以前的帖子(无需用相同的代码重新发布另一个问题),有几件事。

首先:将要传递给POST调用的数据构造为包含ID和日期的简单对象的集合。例如:

{ 
  id = rid,
  date = date
}

,然后将其添加到名为“ updateData”的集合中,而不是将ID和日期分成两个单独的数组。然后在服务器端代码中,声明一个简单的视图模型类:

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

在ajax调用中代替:

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

您会想要类似的东西:

data: { updates: updateData }, 

其中updateData是您的ID +日期对的集合。

,然后在您的方法中使用该视图模型:    公共ActionResult流程(IList更新)

假设请求数据是作为Json发送的,ASP.Net应该自动为您转换该数据,尽管您可能需要配置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();
        }
    }
}

现在这是您可能要尝试做的非常简单的猜测。但是,理想情况下,从某种意义上说更新应该只处理现有记录,更新应该与添加完全分开。如果遇到无法找到的ID,则应该抛出错误,忽略和/或向用户返回不正确的状态。创建新条目应该是一个单独的调用,并确保使用其必填字段正确初始化记录。

您的原始代码似乎正在获取ID列表,但随后创建了一个新实体,并调用了没有DbContext或POST调用中的任何值的“ getStuff”方法,但随后尝试将该实体中的值复制到您传递的字符串参数中(该参数将覆盖Json字符串),但是这些都不会更新一个实体,而该实体永远不会更新您的数据。

慢慢尝试并按照示例进行操作,然后尝试将其适应您的想法。然后编写一堆实际上并没有多大意义的代码,然后想知道为什么它行不通,这将使建设性和沮丧程度降低很多。您的原始代码可能存在十几个或更多个问题和效率低下的问题。仅仅将其粘贴在Stack上,基于这些问题的注释就会很混乱,这些注释对您要解决的第一个问题并没有真正帮助。将其减少到最低限度,首先以有意义的方式将所需的数据获取到服务器,然后从此尝试使用该数据更新您的实体。