c# - 修改模型时的 ASP.NET MVC TryValidateModel() 问题

标签 c# asp.net asp.net-mvc asp.net-mvc-2 asp.net-mvc-validation

我有一个两步表单流程,其中第一组数据存储在 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
}

Controller

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

关于 ModelState 和 ValidateModel() 的工作原理,似乎有一些我不知道的底层功能,我只是不知道是什么。

更新

我不会说我已经解决了这个问题,但找到了一个不太好的解决方法,通过进入 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);
}

最佳答案

在模型绑定(bind)期间,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))
   {
     ...
   }
}

关于c# - 修改模型时的 ASP.NET MVC TryValidateModel() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8574524/

相关文章:

c# - "() =>"在 C# 中是什么意思?

c# - 在 C# 中解析 XML 文件的最快方法?

c# - 停止双重回发

c# - 带有 HTML5 控件的 Visual Studios Formview

c# - FileStreamResult 不返回主体

c# - 是否可以在 ASP.NET MVC3 中检索某个 Url 字符串的 Controller 实例?

c# - 如何在不使用 sleep 的情况下在 C# 中执行短暂的延迟?

c# - 如何反序列化 JSON 数组并忽略根节点?

asp.net ListView,在页脚中显示计算摘要?

asp.net-mvc - 使用SQL Server数据库而不是本地数据库asp.net mvc 5数据库优先的asp.net标识表