我的问题的一些背景 - 我继承了一个大型的C#MVC应用程序,我目前正在对应用程序中的主要进程进行更改。
所以最初,用户会上传一个项目,那就是那个。然而,现在,用户可以选择一个复选框以便交付物品。如果选中此复选框,则会使用相关详细信息填充“传递”表。
以下是我的Items控制器中用于最初上传项目详细信息时的POST操作:
[HttpPost]
public ActionResult AddItemDetails(Int64? itemId, Item item, FormCollection formValues)
{
if (formValues["cancelButton"] != null)
{
return RedirectToAction("Index");
}
if (formValues["backButton"] != null)
{
return RedirectToAction("AddItemStart");
}
string ImageGuid = formValues["ImageGUID"];
ViewData["Image_GUID"] = ImageGuid;
if (item.ImageID == null && String.IsNullOrEmpty(ImageGuid))
{
ModelState.AddModelError("Image", "Image is required.");
ViewData["Image"] = "Image is required.";
}
if (ModelState.IsValid)
{
item.SubmissionState = -1; // Unsubmitted;
/**********************ADDED 25/1/2011**************************/
item.ProductCode = formValues["ProductCode"];
item.Name = formValues["Name"];
string deliverySelection = formValues["deliverySelection"];
if (deliverySelection == "on")
{
item.DeliverySelection = "Yes";
Delivery c = new Delivery()
{
ProductCode = formValues["ProductCode"],
Name = formValues["Name"],
PhoneNo = formValues["PhoneNo"],
Address = formValues["Address"],
SubmissionDate = System.DateTime.Now
};
item.Delivery = c;
}
else
{
item.DeliverySelection = "No";
}
/*****************************END*******************************/
if (itemId.HasValue)
{
UpdateItemDetails(item, ImageGuid, this);
}
else
{
titleId = ItemServices.AddItem(item, ImageGuid);
}
return RedirectToAction("AddSubItemDetails", new { itemId = item.ItemID });
}
return View(item);
}
这很好,并达到了预期的效果。但是,我在Item控制器中修改更新操作时有点困难。以下是我到目前为止的情况:
[HttpPost]
public ActionResult UpdateItemDetails(Int64 itemId, Item item, FormCollection formValues)
{
if (formValues["cancelButton"] != null)
{
return RedirectToAction("View", new { itemId = itemId });
}
string image = formValues["ImageGUID"];
ViewData["Image_GUID"] = ImageGuid;
if (item.ImageID == null && String.IsNullOrEmpty(ImageGuid))
{
ModelState.AddModelError("Image", "Image is required.");
}
if (ModelState.IsValid)
{
//**********************Added 31.01.2011****************************//
using (ModelContainer ctn = new ModelContainer())
{
string DeliverySelection = formValues["deliverySelection"];
if (deliverySelection == "on")
{
item.DeliverySelection = "Yes";
Delivery c = new Delivery()
{
ProductCode = formValues["ProductCode"],
Name = formValues["Name"],
PhoneNo = formValues["PhoneNo"],
Address = formValues["Address"],
SubmissionDate = System.DateTime.Now
};
ctn.Delierys.AddObject(c);
item.Delivery = c;
}
else
{
item.DeliverySelection = "No";
}
ctn.AddToItems(item);
ctn.SaveChanges();
UpdateItemDetails(item, ImageGuid, this);
return RedirectToAction("View", new { itemId = itemId });
}
return View("UpdateItemDetails", MasterPage, item);
}
注意这是如何略有不同,并使用UpdateItemDetails()来更新数据库。我不确定该怎么做,因为我需要收集formvalues以插入Delivery数据库。这是UpdateItemDetails:
private void UpdateItemDetails(Item item, string ImageFileGuid, ItemsController controller)
{
using (ModelContainer ctn = new ModelContainer())
{
Item existingData = ItemServices.GetCurrentUserItem(item.ItemID, ctn);
controller.UpdateModel(existingData);
existingData.UpdatedBy = UserServices.GetCurrentUSer().UserID;
existingData.UpdatedDate = DateTime.Now;
// If there is a value in this field, then the user has opted to upload
// a new cover.
//
if (!String.IsNullOrEmpty(ImageFileGuid))
{
// Create a new CoverImage object.
//
byte[] imageBytes = FileServices.GetBytesForFileGuid(Guid.Parse(ImageFileGuid));
Image newImage = new Image()
{
OriginalCLOB = imageBytes,
ThumbnailCLOB = ImageServices.CreateThumbnailFromOriginal(imageBytes),
HeaderCLOB = ImageServices.CreateHeaderFromOriginal(imageBytes),
FileName = "CoverImage"
};
existingData.Image = newImage;
}
ctn.SaveChanges();
}
}
上述代码如上所述,在我尝试更新详细信息时会抛出以下错误:
System.Data.SqlClient.SqlException: datetime2数据的转换 输入到日期时间数据类型 在超出范围的价值。该 声明已被终止。
更新操作中的ctn.SaveChanges()会抛出此错误。
所以我想我的第一个问题是如何克服这个错误,但是不做任何会影响AddItemDetails操作的更改。那么我的第二个问题是,如果错误被清除了,那么这是一个正确的更新方式吗?
我非常感谢任何指针。如果需要更多信息,请询问。
谢谢:)
答案 0 :(得分:4)
我正在查看您的错误并找到this answer另一个问题,该问题提供了有关DATETIME和DATETIME2数据类型的更多信息。
DATETIME支持1753/1/1 “永恒”(9999/12/31),而 DATETIME2支持0001/1/1至 永恒。
如果您检查提交的数据,您是否看到任何异常?您的项目类中是否有一个日期属性被设置为对DATETIME字段无效的某个默认值?
答案 1 :(得分:0)
看起来您要保存的对象中的某个日期是DateTime.MinValue。例如,它可能是提交日期。检查您的表单数据,以查看客户端是否正确更新了值,并从那里开始。
答案 2 :(得分:0)
我目前有这个问题,因为如果有人错误地忘记斜杠(例如1/189,当他们意味着1/1/89),TryUpdateModel()会更新模型而不会出错,将其转换为.NET DateTime为“1 / 1/0189" 。
但是随着“将datetime2数据类型转换为日期时间数据类型导致超出范围的值”,Save崩溃了。
所以哇,我在保存之前就抓住了这个?