2011-02-01 25 views
0

我的問題的背景 - 我已經繼承了一個大的C#MVC應用程序,我目前正在對應用程序中的主進程進行更改。MVC更新錯誤:datetime2

所以最初,用戶會上傳一個項目,那就是這樣。然而,現在用戶可以選擇一個複選框,以便交付物品。如果選中此複選框,則會在交貨表中填入相關詳細信息。

這裏是我的項目控制器,當用戶最初上傳項目的詳細信息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); 
     } 

這工作得很好,達到了預期的效果。但是,我有點卡住修改Items控制器中的更新操作。以下是我迄今爲止:

[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: The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value. The statement has been terminated.

此錯誤是在更新行動在ctn.SaveChanges()拋出。

所以我想我的第一個問題是如何克服這個錯誤,但是沒有進行會影響AddItemDetails操作的更改。那麼我的第二個問題就是,如果這個錯誤被清除了,這是否會成爲更新的正確途徑?

我會非常感謝任何指針。如果需要更多信息,請詢問。

謝謝:)

回答

4

我正在調查你的錯誤,發現this answer另一個問題,提供了更多有關DATETIME和DATETIME2數據類型的信息。

DATETIME supports 1753/1/1 to "eternity" (9999/12/31), while DATETIME2 support 0001/1/1 through eternity.

如果您檢查正在提交的數據是否有異常?您的商品類中是否有日期屬性設置爲DATETIME字段無效的某個默認值?

0

它看起來像在對象中的約會,你要保存的一個DateTime.MinValue。例如,它可能是提交日期。檢查你的表單數據,看看是否正確更新了客戶端的值,然後從那裏去。

0

我目前有這個問題,因爲如果有人錯誤地忘記了一個斜槓(例如1/189當他們的意思是1/1/89)時,TryUpdateModel()更新模型沒有錯誤,將其轉換爲.NET DateTime「1/1/0189" 。

但是,隨着「將datetime2數據類型轉換爲日期時間數據類型導致超出範圍的值」,保存崩潰。

所以哇,我救救這個之前呢?

+0

上面鏈接的帖子說「檢查日期的年份 - 如果它是在1753年之前,你需要改變它在1753年後」,但嚴重嗎?TryUpdateModel的全部意義在於您不必對每個字段進行硬編碼驗證檢查。一定有更好的方法。 – 2011-12-15 17:20:06