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