Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的验证消息是通用的?ASP.NETMVC_C#_Asp.net Mvc_Validation - Fatal编程技术网

C# 为什么我的验证消息是通用的?ASP.NETMVC

C# 为什么我的验证消息是通用的?ASP.NETMVC,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,我为这个ASP.NET MVC应用程序编写了一个自定义验证处理程序。以下是验证消息的屏幕截图: 正如你所看到的,头衔和导演工作得很好,但日期却不行。创建视图的代码: <fieldset> <legend>Fields</legend> <p> <%= Html.Label("Title", "Title:") %> <%= Html.TextBox("Title") %>

我为这个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>
我假设验证字典的键值需要与为字段提供的值(本例中为ReleaseDate)对应,但我似乎没有这样做。我还尝试在单词之间添加一个空格,以防它按显示名称查找,但也没有运气

有人能帮我解决这个问题吗

编辑 接下来,我通过应用程序查看另一个验证错误发生的位置。不幸的是,我没有发现任何线索……至少对我来说是显而易见的。这是我的手表窗口的屏幕截图:

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


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

我敢说你有两个问题

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

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


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

    OK,因此在#1中建议的更改中添加了发布日期错误消息,但我仍然有通用错误消息。我将按照您的建议检查调试并发回。@Anders--听起来答案很有帮助,所以我很惊讶没有看到对此答案进行投票。@tvan--soz,在代码之间来回运行。我总是进行投票,只是全神贯注于atm:)完成整个过程(从单击“创建”按钮开始),我看到ModelState只有3个键。您建议在哪里查找此可为null的模型属性或诸如此类的内容?我不确定它在哪里,不幸的是,我面前没有要检查的MVC构建,但您可以在调试到它时通过控制器操作来获取它。我认为它是在你的模型状态下,但是你可能必须打开你的钥匙,看看里面有什么。根据我的经验,这就是为什么你大部分时间都会出现这种错误。因为它试图将null值绑定到不可为null的属性。FKs只是可能发生的一种方式。
    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;
    }