Проблемы с ASP.NET MVC TryValidateModel () при изменении модели

У меня есть двухэтапный процесс формы, в котором первый набор данных сохраняется в сеансе.

[IsMp4File]
[Required(ErrorMessage = "* Please select a video to upload")]
public HttpPostedFileBase VideoClip { get; set; }

[Required(ErrorMessage = "* Please select a thumbmail image")]
public HttpPostedFileBase VideoThumbnail{ get;  set; }

public string VideoFileName { get { return VideoClip.FileName; } }

public NewsWizardStep CurrentStep { get; set; }

...

public enum NewsWizardStep : int
{
  One = 1,
  Two = 2,
  Three = 3,
  Four = 4,
  Five = 5,
  Six = 6
}

Контроллер

public ActionResult TvCreate(TvNewsVideoVM modelVM)
{
   if (modelVM.CurrentStep == NewsWizardStep.Two)
   {
     var sessionModel = ((TvNewsVideoVM)Session["TvModelVM"]);

     modelVM.VideoClip = sessionModel.VideoClip;
     modelVM.VideoThumbnail = sessionModel.VideoThumbnail;
   }

   if (TryValidateModel(modelVM))
   {
     ...
   }
}

TryValidateModel (modelVM) возвращает false, говоря, что требуются VideoClip и VideoThumnail, несмотря на сопоставление их из SeeionModel в viewModel. Я добавил точку останова и проверил, что они не равны нулю.

Похоже, есть некая базовая функциональность, о которой я не знаю, относительно того, как работают ModelState и ValidateModel (), я просто не знаю что.

ОБНОВЛЕНИЕ

Я бы не сказал, что решил проблему, но нашел обходной путь, который не так хорош. Перейдя в ModelState, можно установить ModelValue с помощью SetModelValue () , затем вручную удалите ошибку из состояния модели и затем вызовите TryValidateModel () - возможно, вам даже не придется добавлять значения, просто удалите ошибку, которую я не пробовал. Вот моя работа.

if (modelVM.CurrentStep == NewsWizardStep.Two)
{
  var sessionModel = ((MtTvNewsVideoVM)Session["MtTvModelVM"]);

  modelVM.VideoClip = sessionModel.VideoClip;
  modelVM.VideoThumbnail = sessionModel.VideoThumbnail;

  ModelState.SetModelValue("VideoClip", new  ValueProviderResult(sessionModel.VideoThumbnail, sessionModel.VideoFileName, CultureInfo.CurrentCulture));
                ModelState.SetModelValue("VideoThumbnail", new ValueProviderResult(sessionModel.VideoClip, sessionModel.VideoFileName, CultureInfo.CurrentCulture));

  ModelState["VideoClip"].Errors.RemoveAt(0);
  ModelState["VideoThumbnail"].Errors.RemoveAt(0);
}
16
задан Bassam Mehanni 20 December 2011 в 14:49
поделиться