为什么我的验证消息是通用的? ASP.NET MVC

时间:2009-08-21 15:26:53

标签: c# asp.net-mvc validation

我为这个ASP.NET MVC应用程序编写了一个自定义验证处理程序。以下是验证消息的屏幕截图:

alt text

正如您所看到的,标题和导演工作正常,但日期却没有。我创建视图的代码:

<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之后,我逐步完成了应用程序以查看其他验证错误发生的位置。不幸的是,我没有发现任何线索......至少对我来说很明显。以下是我的观察窗口的屏幕截图:

alt text

正如所料,其中有三个键:标题,目录和发布日期。没有第四个(列表中的第三个?见第一个屏幕截图)验证失败的迹象。

任何其他建议将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:2)

我怀疑问题是当模型绑定器尝试将空值绑定到不可为空的模型属性时,会标记错误。您可能希望清除该特定属性上的任何错误的ModelState,然后添加您自己的模型验证错误。如果ModelState包含同一属性的多个错误,则可能只会获得第一个匹配的错误。

您还可以将ReleaseDate属性设为可空(DateTime?),然后只需检查是否已提供日期。如果可能的话,这可能是最简单的更改,但如果模型是从数据库派生的,并且该字段不可为空,那么您必须引入一个视图模型来完成它。

答案 1 :(得分:1)

我冒昧地说你有两个问题。

  1. 我假设ReleaseDate是DateTime。如果是这种情况,那么执行movieToValidate.ReleaseDate.ToString()将返回“1/1/1900 blahblah”。你不应该检查长度,你应该像movieToValidate.ReleaseDate == DateTime.MinValue一样检查它。
  2. 我得到了“A值是必需的”。错误之前,我不认为我应该得到一个错误。它与我的模型有关,没有指出它认为是必需的东西。例如,就像没有设置与另一个对象的FK关系或其他东西。如果您在控制器中调试应用程序,您应该能够看到ModelErrors并深入查看该特定错误,并查看它的来源。