Подтвердить что ты не робот

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, несмотря на то, что они сопоставлены с viewionModel в viewModel. Я добавил точку останова и проверил, что они не являются нулевыми.

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

UPDATE

Я бы не сказал, что решил проблему, но выяснил обходное решение, которое не так уж и красиво. Перейдя в 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);
}
4b9b3361

Ответ 1

Во время привязки модели DefaultModelBinder проверяет ваши параметры действия. Поэтому, когда выполнение соответствует вашему методу public ActionResult TvCreate(TvNewsVideoVM modelVM) ModelState уже содержит ошибки проверки.
Когда вы вызываете TryValidateModel, не очищает ModelState, поэтому ошибки проверки остаются там, поэтому он возвращает false. Поэтому вам нужно очистить коллекцию ModelState, если вы хотите вручную выполнить проверку:

public ActionResult TvCreate(TvNewsVideoVM modelVM)
{
   ModelState.Clear();

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

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

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