我为此 ASP.NET MVC 应用程序编写了一个自定义验证处理程序。以下是验证消息的屏幕截图:
如您所见,标题和导演很好,但日期不行。我用于创建 View 的代码:
<fieldset>
<legend>Fields</legend>
<p>
<%= Html.Label("Title", "Title:") %>
<%= Html.TextBox("Title") %>
<%= Html.ValidationMessage("Title", "*") %>
</p>
<p>
<%= Html.Label("Director", "Director:")%>
<%= Html.TextBox("Director") %>
<%= Html.ValidationMessage("Director", "*") %>
</p>
<p>
<%= Html.Label("ReleaseDate", "Release Date:")%>
<%= Html.TextBox("ReleaseDate") %>
<%= Html.ValidationMessage("ReleaseDate", "*") %>
</p>
<p>
<%= Html.Submit("Create") %>
</p>
</fieldset>
这是处理验证逻辑的代码:
public bool ValidateMovie(Movie movieToValidate)
{
if (movieToValidate.Title.Trim().Length == 0)
_validationDictionary.AddError("Title", "Title is required.");
if (movieToValidate.Director.Trim().Length == 0)
_validationDictionary.AddError("Director", "Director is required.");
if (movieToValidate.ReleaseDate.ToString().Trim().Length == 0)
_validationDictionary.AddError("ReleaseDate", "Release Date is required.");
return _validationDictionary.IsValid;
}
我假设验证字典的键值需要与为字段提供的值(本例中为ReleaseDate)相对应,但这对我来说似乎没有发生。我还尝试在单词之间添加一个空格,以防它通过显示名称查找它,但也没有运气。
谁能帮我解决这个问题吗?
编辑
已关注 Joseph's suggestion ,我单步执行应用程序以查看其他验证错误发生的位置。不幸的是,我没有发现任何线索……至少对我来说是显而易见的。这是我的 watch 窗口的屏幕截图:
正如预期的那样,其中包含三个键:标题、目录和发布日期。没有第四个(列表中的第三个?参见第一个屏幕截图)验证失败的迹象。
如有任何其他建议,我们将不胜感激!谢谢!
最佳答案
我怀疑问题是当模型绑定(bind)器尝试将空值绑定(bind)到不可为空的模型属性时,错误被标记。您可能想要清除该特定属性上的任何错误的 ModelState,然后添加您自己的模型验证错误。如果 ModelState 包含同一属性的多个错误,您可能只会得到第一个匹配的错误。
您还可以将 ReleaseDate 属性设为可为空(DateTime?),然后只需检查是否已提供日期。如果可能的话,这可能是最简单的更改,但如果模型派生自数据库并且该字段不可为空,则您必须引入 View 模型来完成它。
关于c# - 为什么我的验证消息是通用的? ASP.NET MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1312648/