我较早发布了问题,但未收到任何正确的答复,因此再次进行了一些编辑。我有一个接受两个参数的功能, 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
答案 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上,基于这些问题的注释就会很混乱,这些注释对您要解决的第一个问题并没有真正帮助。将其减少到最低限度,首先以有意义的方式将所需的数据获取到服务器,然后从此尝试使用该数据更新您的实体。