- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个两步表单流程,其中第一组数据存储在 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/
我有一个 Controller ,它使用模型绑定(bind)从表单中检索数据。我需要在验证之前对模型进行一些编辑,所以我按照文档建议使用 TryValidateModel。但是由于某种原因,即使“用户
我有一个需要模型列表的操作。我想同时验证每个模型与整个模型集合。我正在尝试使用 TryValidateModel,但似乎如果我的任何一个模型无效,那么所有模型都无效。我的表单显示 5 个 Survey
使用普通 MVC,我可以使用 TryValidateModel 重新验证我的模型。 TryValidateModel方法似乎不适用于WebAPI。使用 WebAPI 时如何重新验证我的模型? 最佳答案
我正在编写类似这样的测试框架:https://github.com/ivaylokenov/MyTested.WebApi但对于 ASP.NET 5 MVC 6(使用 6.0.0-beta8)。 我很
我有一个两步表单流程,其中第一组数据存储在 session 中。 [IsMp4File] [Required(ErrorMessage = "* Please select a video to up
我正在尝试为 Asp.Net Core Web API 的 ModelState 验证编写单元测试。 我读到,最好的方法是使用 TryValidateModel 函数。但是,每次我运行单元测试时,它都
我是一名优秀的程序员,十分优秀!