2011-02-01 2 views
0

Немного фона для моей проблемы. Я унаследовал большое приложение C# MVC, и сейчас я вношу изменения в основной процесс в приложении.Ошибка обновления MVC: datetime2

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

Вот действие POST в моем контроллере Items, когда пользователь первоначально будет загружать детали записи:

 [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 заключается в том, что вам не нужно проверять достоверность кода в каждом поле. Там должен быть лучший путь. –

Смежные вопросы