C# MVC Ajax表单,无阻碍的验证错误不会消失

C# MVC Ajax表单,无阻碍的验证错误不会消失,c#,ajax,asp.net-mvc,razor,C#,Ajax,Asp.net Mvc,Razor,我遇到了一个问题,表单错误在页面上持续存在,即使表单是有效的 我有以下设置: _Layout.cshtml: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>@ViewBag.Title</title> <link href="@Url.Content("~/Content/Site.css")" rel="styles

我遇到了一个问题,表单错误在页面上持续存在,即使表单是有效的

我有以下设置:

_Layout.cshtml:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
</head>

<body>
    @RenderBody()
</body>
</html>
Name.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace SimpleForm.Models
{
    public class Name
    {
        [Required()]
        public string first { get; set; }
        public string last { get; set; }
    }
}
表单填充得很好,如果我没有先输入任何内容,表单就不会提交,我会看到错误。在填充了一些内容之后,我首先得到ajax调用,然后它向div发布“Success”

然而,这就是问题所在,错误“第一个字段是必需的。”仍然保留在页面上。这就好像ajax提交表单是在验证有机会清除错误之前通过的,然后它就再也没有机会了。


有没有办法让验证仍然删除错误?

表单没有被验证,因为您的
onblur
事件正在缩短
jquery unobtrusive ajax.js
中的提交过程

相反,将这两个字段的onblur事件更改为以下内容:

$(this).parents('form:first').find(':submit')[0].click(); 
这将调用jquery.unobtrusive-ajax.js脚本,导致在向服务器提交ajax之前进行验证

更新

当我回顾您的视图时,我看到您正在调用
@Html.ValidateFor()
以获取您的属性。这将在
@HTML.ValidationSummary
创建的div之外创建HTML标记


因为此标记超出了非侵入性验证所期望的范围,所以此标记永远不会被覆盖,并且将始终保持不变。删除@Html.ValidateFor()行。如果在初始加载后需要验证消息,请在document.ready上调用validate(),以设置验证消息。

因为我没有找到解决此问题的正确方法,所以我决定只针对验证摘要错误div并添加类display:none;对黎族元素。这将隐藏在提交表单之前未清除的验证错误

$('#form_errors').children('div.validation-summary-errors').children('ul').children('li').css('display','none')

必须有一个更好的解决方案,但我已经尝试了所有方法,不明白为什么我强制验证的尝试不起作用。

我觉得我之前的电话缩短了提交过程是有道理的。但即使我将代码更改为您在这里建议的代码,它仍然不起作用。错误将保留在页面上。。。我觉得这个答案对于缩短提交过程提出了一个很好的观点,我想进一步探讨这个问题以找到问题的答案。Epic,尝试添加
$(this)。parents('form:first')。validate()在单击()代码之前。也许强制验证是解决办法。顾问本,我以前试过一次,但也没用。我不确定它为什么不起作用。你会认为调用.validate()会运行不引人注目的验证吗?噢!我在复习我的一些答案。当我回顾您的视图时,我看到您正在调用
@Html.ValidateFor()
以获取您的属性。这将在
@HTML.ValidationSummary
创建的div之外创建HTML标记。因为此标记超出了非侵入性验证所期望的范围,所以此标记永远不会被覆盖,并且将始终保持不变。删除@Html.ValidateFor()行。如果您在初次加载后需要验证消息,请在document.ready上调用
validate()
,感谢您的关注。如果你用你提供的信息更新你的答案,我会把它标记为答案。虽然我还没有完全测试它,但似乎你是正确的。我仍然需要一个有效的答案。我已经提供了复制该问题所需的所有文件。如果有人能明白为什么它不起作用,我将不胜感激。
$(this).parents('form:first').find(':submit')[0].click(); 
$('#form_errors').children('div.validation-summary-errors').children('ul').children('li').css('display','none')