Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC TryValidateModel()在修改模型时出现问题_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 2_Asp.net Mvc Validation - Fatal编程技术网

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

C# ASP.NET MVC TryValidateModel()在修改模型时出现问题,c#,asp.net,asp.net-mvc,asp.net-mvc-2,asp.net-mvc-validation,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 2,Asp.net Mvc Validation,我有一个两步表单流程,其中第一组数据存储在会话中 [IsMp4File] [Required(ErrorMessage = "* Please select a video to upload")] public HttpPostedFileBase VideoClip { get; set; } [Required(ErrorMessage = "* Please select a thumbmail image")] public HttpPostedFileBase VideoThumb

我有一个两步表单流程,其中第一组数据存储在会话中

[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 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,然后手动从model状态中删除错误,然后调用
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);
}

在模型绑定过程中,
DefaultModelBinder
验证您的操作参数。 因此,当执行命中您的
公共操作结果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))
   {
     ...
   }
}

谢谢-我不明白为什么TryValidateModel()方法不先调用Clear()方法,然后尝试验证模型。如果您只对手动验证感兴趣,可以跳过初始验证魔术,在控制器方法中添加ValidateInput false是关键。它将保持ModelState中的值,但只需跳过自动检查。ModelState.Clear很好,但它会清除这些值。等等,等等,情况似乎不是这样-不确定ValidateInput对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))
   {
     ...
   }
}