我有一个两步形式的过程,第一组数据存储在会话中。
[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。我添加了断点并检查它们是否为空。
看起来有些基础功能我不知道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);
}
答案 0 :(得分: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))
{
...
}
}