MVC контроллер if/else оператор

У меня есть форма MVC, которая представлена ​​с данными. После отправки он переходит в форму предварительного просмотра, где пользователь может решить, продолжить ли публикацию или отредактировать форму снова.

Помимо отправки данных, я также предлагаю возможность загрузить изображение. У меня в основном есть 3 сценария в этой форме предварительного просмотра:

  1. обновить форму и сохранить существующую картинку
  2. обновить форму и заменить (или удалить) существующую картинку
  3. обновить форму и добавить картинку (если раньше ее не было)

Теперь сценарии 2) и 3) работают нормально, но я борюсь с сценарием 1). По какой-то причине любая существующая картинка (из первоначальной отправки) будет переопределена / удалена. Когда я попытался отладить, я заметил, что предложение else моего оператора if просто пропускается.

Я сомневаюсь, что это как-то связано с моим представлением или моделью, поэтому я публикую соответствующий код моего контроллера.

    public ActionResult UpdateErrand(
        [Bind(Exclude                       = "Picture")]errands model)
    {
        // define variables for reuse
        var userID                          = User.Identity.GetUserId();
        DateTime nowUTC                     = DateTime.Now.ToUniversalTime();
        DateTime nowLocal                   = DateTime.Now.ToLocalTime();
        // get picture and get it to bytes
        string picture                      = Request.Form["editErrandCroppedPicture"];
        byte[] imageBytes                   = Convert.FromBase64String(picture);
        // define errand
        var errand                          = new errands
        {
            // basics
            UserID                          = userID,
            FirstName                       = UserManager.FindById(userID).FirstName,
            Email                           = UserManager.FindById(userID).Email,
            Phone                           = UserManager.FindById(userID).PhoneNumber,
            //Rating                        = 

            // form
            ID                              = model.ID,
            Category                        = model.Category,
            SubCategory                     = model.SubCategory,
            Title                           = model.Title,
            Description                     = model.Description,
            Location                        = model.Location,
            ASAP                            = model.ASAP,
            StartDateTime                   = model.StartDateTime,
            DurationInHours                 = model.DurationInHours,
            EndDateTime                     = model.EndDateTime,
            DateTimePosted                  = nowLocal,
            Currency                        = model.Currency,
            Offering                        = model.Offering,
            Price                           = model.Price,
            errandTax                       = model.errandTax,
            PaymentMethod                   = model.PaymentMethod,
            LatitudePosted                  = model.LatitudePosted,
            LongitudePosted                 = model.LongitudePosted,
            LocationPosted                  = model.LocationPosted,
            Published                       = true
        };
        // workaround to ensure picture is uploaded correctly
        if (imageBytes.Length               > 2)
        {
            errand.Picture                  = imageBytes;
        }
        else
        {
            errand.Picture                  = model.Picture;
        }
        // save errand to DB
        ERRANDOM.Entry(errand).State = EntityState.Modified;
        ERRANDOM.SaveChanges();
        // track user activity: post includes activity name, timestamp along with location, and if authenticated, user ID
        var SUCCESS                         = new UserActivities
        {
            UserID                          = userID,
            ActivityName                    = "EditErrand_Success",
            ActivityTimeStampUTC            = nowUTC,
            ActivityLatitude                = model.LatitudePosted,
            ActivityLongitude               = model.LongitudePosted,
            ActivityLocation                = model.LocationPosted
        };
        ERRANDOM.UserActivityList.Add(SUCCESS);
        ERRANDOM.SaveChanges();
        return RedirectToAction("errandPreview");
    }

2 ответа

Решение

Если вы пометите объект как измененный (.State = EntityState.Modified) все его сопоставленные скалярные свойства (т.е. не навигационные свойства) будут частью оператора обновления SQL. Тем не менее, можно исключить выбранные свойства из обновления. Вот как это сделать:

...
LatitudePosted = model.LatitudePosted,
LongitudePosted = model.LongitudePosted,
LocationPosted = model.LocationPosted,
Published = true
errand.Picture = imageBytes;

ERRANDOM.Entry(errand).State = EntityState.Modified;

if (imageBytes.Length <= 2)
{
    ERRANDOM.Entry(errand).Property(e => e.Picture).IsModified = false;
}

ERRANDOM.SaveChanges();

Как видите, теперь вы можете назначить errand.Picture = imageBytes безусловно: он будет исключен позже, когда он не нуждается в обновлении. Это также экономит пропускную способность при обновлении поручений в (предположительно) наиболее распространенном случае, когда изображение не обновляется.

Вы исключаете привязку Picture, поэтому ваше предложение IF оператор else будет присваивать нулевое значение (model.Picture) "новому" объекту поручений.

Другие вопросы по тегам