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

Sim*_*tes 16 c# asp.net asp.net-mvc asp.net-mvc-validation asp.net-mvc-2

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

[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; }
Run Code Online (Sandbox Code Playgroud)

...

public enum NewsWizardStep : int
{
  One = 1,
  Two = 2,
  Three = 3,
  Four = 4,
  Five = 5,
  Six = 6
}
Run Code Online (Sandbox Code Playgroud)

调节器

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))
   {
     ...
   }
}
Run Code Online (Sandbox Code Playgroud)

TryValidateModel(modelVM)返回false,表示需要VideoClip和VideoThumnail,尽管将它们从seesionModel映射到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);
}
Run Code Online (Sandbox Code Playgroud)

nem*_*esv 22

在模型绑定期间,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))
   {
     ...
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您只对手动验证感兴趣,可以通过使用<ValidateInput(False)>装饰Controller方法来跳过初始验证魔术 (3认同)