我为这个ASP.NET MVC应用程序编写了一个自定义验证处理程序。以下是验证消息的屏幕截图:
正如您所看到的,标题和导演工作正常,但日期却没有。我创建视图的代码:
<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之后,我逐步完成了应用程序以查看其他验证错误发生的位置。不幸的是,我没有发现任何线索......至少对我来说很明显。以下是我的观察窗口的屏幕截图:
正如所料,其中有三个键:标题,目录和发布日期。没有第四个(列表中的第三个?见第一个屏幕截图)验证失败的迹象。
任何其他建议将不胜感激!谢谢!
答案 0 :(得分:2)
我怀疑问题是当模型绑定器尝试将空值绑定到不可为空的模型属性时,会标记错误。您可能希望清除该特定属性上的任何错误的ModelState,然后添加您自己的模型验证错误。如果ModelState包含同一属性的多个错误,则可能只会获得第一个匹配的错误。
您还可以将ReleaseDate属性设为可空(DateTime?),然后只需检查是否已提供日期。如果可能的话,这可能是最简单的更改,但如果模型是从数据库派生的,并且该字段不可为空,那么您必须引入一个视图模型来完成它。
答案 1 :(得分:1)
我冒昧地说你有两个问题。