MVC контроллер if/else оператор
У меня есть форма MVC, которая представлена с данными. После отправки он переходит в форму предварительного просмотра, где пользователь может решить, продолжить ли публикацию или отредактировать форму снова.
Помимо отправки данных, я также предлагаю возможность загрузить изображение. У меня в основном есть 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) "новому" объекту поручений.