修改模型时,ASP.NET MVC TryValidateModel()问题 [英] ASP.NET MVC TryValidateModel() Issues when Model is Modified

查看:114
本文介绍了修改模型时,ASP.NET MVC TryValidateModel()问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个两步骤的表单处理过程,其中第一组数据存储在会话中.

I have a two step form process where the first set of data is stored in session.

[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.我添加了一个断点并检查它们是否不为空.

TryValidateModel(modelVM) returns false, saying VideoClip and VideoThumnail are required, despite mapping them from the seesionModel to the viewModel. I have added a breakpoint and checked they are not null.

对于ModelState和ValidateModel()的工作方式,我似乎不了解某些基本功能,我只是不知道什么.

It looks like there is some underlying functionality I am not aware of regarding how ModelState and ValidateModel() work , I just don't know what.

更新

我不会说我已经解决了问题,但是想出了一个不太好的解决方法,通过进入ModelState,可以使用SetModelValue()设置ModelValue,然后手动从模型状态中删除错误然后调用TryValidateModel()-您甚至不必添加值,只需删除我没有尝试过的错误即可.这是我的工作.

I wouldn't say I have resolved the issue but figured out a workaround that isn't that pretty, By going into the ModelState it is possible to set the ModelValue using SetModelValue() then manually remove the error from the model state and then call TryValidateModel() - you might not even have to add the values just remove the error I have not tried. Here is my work around.

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);
}

推荐答案

在模型绑定期间,DefaultModelBinder会验证您的操作参数. 因此,当执行命中您的public ActionResult TvCreate(TvNewsVideoVM modelVM)方法时 ModelState已经包含验证错误.
调用TryValidateModel时,它不会清除 ModelState,因此验证错误仍然存​​在,这就是为什么它返回false的原因.因此,如果您想稍后手动重做验证,则需要清除ModelState集合:

During the model binding the DefaultModelBinder validates your action parameters. So when the execution hits your public ActionResult TvCreate(TvNewsVideoVM modelVM) method the ModelState is already containing the validation errors.
When you call TryValidateModel it doesn't clear the ModelState so the validation errors remain there that is why it returns false. So you need to clear the ModelState collection if you want to redo the validation later manually:

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))
   {
     ...
   }
}

这篇关于修改模型时,ASP.NET MVC TryValidateModel()问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆