ASP.NET MVC TryValidateModel()修改模型时出现问题

我有一个两步forms的过程,其中第一组数据存储在会话中。

[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,尽管它们从seesionModel映射到viewModel。 我添加了断点并检查它们是否为空。

看起来有些基础function我不知道ModelState和ValidateModel()是如何工作的,我只是不知道是什么。

UPDATE

我不会说我已经解决了这个问题,但想出了一个不那么漂亮的解决方法。通过进入ModelState,可以使用SetModelValue()设置ModelValue然后手动从模型状态中删除错误然后调用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); } 

在模型绑定期间, DefaultModelBindervalidation您的操作参数。 因此,当执行命中您的public ActionResult TvCreate(TvNewsVideoVM modelVM)方法时, ModelState已经包含validation错误。
当您调用TryValidateModel不会清除 ModelState因此validation错误仍然存​​在,这就是它返回false的原因。 因此,如果要稍后手动重做validation,则需要清除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)) { ... } }