Asp.net 当用户使表单无效时,单击“取消”按钮时,如何清除MVC客户端验证错误?

Asp.net 当用户使表单无效时,单击“取消”按钮时,如何清除MVC客户端验证错误?,asp.net,asp.net-mvc,validation,asp.net-mvc-2,Asp.net,Asp.net Mvc,Validation,Asp.net Mvc 2,我有一个在主视图中渲染的局部视图。部分视图利用了System.ComponentModel.DataAnnotations和Html.EnableClientValidation() 单击链接,包含局部视图的div将显示在JQuery.Dialog()中 然后单击“保存”按钮,而不在已验证的输入字段中输入任何文本。这将导致客户端验证按预期启动,并在无效字段旁边显示“*required”消息 单击“取消”按钮时,我希望将客户端MVC验证重置回其默认状态,并删除所有消息,以备用户再次打开对话框时使用

我有一个在主视图中渲染的局部视图。部分视图利用了
System.ComponentModel.DataAnnotations
Html.EnableClientValidation()

单击链接,包含局部视图的div将显示在
JQuery.Dialog()中

然后单击“保存”按钮,而不在已验证的输入字段中输入任何文本。这将导致客户端验证按预期启动,并在无效字段旁边显示“*required”消息


单击“取消”按钮时,我希望将客户端MVC验证重置回其默认状态,并删除所有消息,以备用户再次打开对话框时使用。有推荐的方法吗?

此答案适用于MVC3。有关将其更新为MVC4和MVC5的帮助,请参见下面的注释

如果您只想清除验证消息,以便它们不会显示给用户,您可以使用javascript这样做:

function resetValidation() {
        //Removes validation from input-fields
        $('.input-validation-error').addClass('input-validation-valid');
        $('.input-validation-error').removeClass('input-validation-error');
        //Removes validation message after input-fields
        $('.field-validation-error').addClass('field-validation-valid');
        $('.field-validation-error').removeClass('field-validation-error');
        //Removes validation summary 
        $('.validation-summary-errors').addClass('validation-summary-valid');
        $('.validation-summary-errors').removeClass('validation-summary-errors');

    }
如果您需要重置,使其仅在弹出窗口中工作,您可以这样做:

function resetValidation() {
        //Removes validation from input-fields
        $('#POPUPID .input-validation-error').addClass('input-validation-valid');
        $('#POPUPID .input-validation-error').removeClass('input-validation-error');
        //Removes validation message after input-fields
        $('#POPUPID .field-validation-error').addClass('field-validation-valid');
        $('#POPUPID .field-validation-error').removeClass('field-validation-error');
        //Removes validation summary 
        $('#POPUPID .validation-summary-errors').addClass('validation-summary-valid');
        $('#POPUPID .validation-summary-errors').removeClass('validation-summary-errors');

    }
$('#MyFormId input').clearErrors();

我希望这就是你想要的效果。

谢谢。对于一个稍微不同的场景,我有一个类似的问题。我有一个屏幕,当你点击其中一个提交按钮时,它会下载一个文件。在MVC中,当您返回要下载的文件时,它不会切换屏幕,因此验证摘要中已经存在的任何错误消息将永远保留在那里。我当然不希望在再次提交表单后,错误消息留在那里。但我也不想清除在客户端单击submit按钮时捕获的字段级验证。此外,我的一些观点不止一种形式

我在网站的底部添加了以下代码(感谢您)。母版页适用于我的所有视图

    <!-- This script removes just the summary errors when a submit button is pressed 
    for any form whose id begins with 'form' -->
<script type="text/javascript">
    $('[id^=form]').submit(function resetValidation() {
        //Removes validation summary
        $('.validation-summary-errors').addClass('validation-summary-valid');
        $('.validation-summary-errors').removeClass('validation-summary-errors');
    });
</script>

$('[id^=form]')。提交(函数resetValidation(){
//删除验证摘要
$('.validation summary errors').addClass('validation-summary-valid');
$('.validation-summary-errors').removeClass('validation-summary-errors');
});

再次感谢。

您可以点击验证库方法来执行此操作。 有两个感兴趣的对象:
FormContext
FieldContext
。您可以通过表单的
\u MVC\u FormValidation
属性访问
FormContext
,并通过
FormContext
字段
属性访问每个已验证属性的一个
FieldContext

因此,要清除验证错误,可以对
表单执行类似的操作

var fieldContexts = form.__MVC_FormValidation.fields;
for(i = 0; i < fieldContexts.length; i++) {
    var fieldContext = fieldContexts[i];
    // Clears validation message
    fieldContext.clearErrors();
}
// Clears validation summary
form.__MVC_FormValidation.clearErrors();
var fieldContexts=form.\uu MVC\u FormValidation.fields;
对于(i=0;i
然后,您可以将这段代码挂接到您需要的任何事件上

此(完全未记录)见解的来源:

  • (提及现场环境)
  • (用于指出哪些方法如何通过javascript触发客户端验证)

如果您使用MVC附带的不引人注目的验证,您只需执行以下操作:

$.fn.clearErrors = function () {
    $(this).each(function() {
        $(this).find(".field-validation-error").empty();
        $(this).trigger('reset.unobtrusiveValidation');
    });
};
----------------------------------------------------------------

第三方编辑: 在我的例子中,这主要起作用,但我必须删除
$(This.find(“.field validation error”).empty()行。这似乎会影响重新提交时验证消息的重新显示

我使用了以下方法:

$.fn.clearErrors = function () {
        $(this).each(function() {
            $(this).trigger('reset.unobtrusiveValidation');
        });
    };
然后这样称呼它:

function resetValidation() {
        //Removes validation from input-fields
        $('#POPUPID .input-validation-error').addClass('input-validation-valid');
        $('#POPUPID .input-validation-error').removeClass('input-validation-error');
        //Removes validation message after input-fields
        $('#POPUPID .field-validation-error').addClass('field-validation-valid');
        $('#POPUPID .field-validation-error').removeClass('field-validation-error');
        //Removes validation summary 
        $('#POPUPID .validation-summary-errors').addClass('validation-summary-valid');
        $('#POPUPID .validation-summary-errors').removeClass('validation-summary-errors');

    }
$('#MyFormId input').clearErrors();

为了完全清除验证工件,包括消息、输入字段的彩色背景和输入字段周围的彩色轮廓,我需要使用以下代码,其中(在我的例子中)是一个包含嵌入表单的引导模式对话框

$(this).each(function () {
    $(this).find(".field-validation-error").empty();
    $(this).find(".input-validation-error").removeClass("input-validation-error");
    $(this).find(".state-error").removeClass("state-error");
    $(this).find(".state-success").removeClass("state-success");
    $(this).trigger('reset.unobtrusiveValidation');
});

在这里,您可以使用简单删除错误消息

$('.field-validation-valid span').html('')


您只需在jQuery中定义一个新函数:

$.fn.resetValidation = function () {
    $(this).each(function (i, e) {
        $(e).trigger('reset.unobtrusiveValidation');
        if ($(e).next().is('span')) {
            $(e).next().empty();
        }
    });
};
然后将其用于输入字段:

$('#formId input').resetValidation();

单击Cancel按钮将关闭JQuery对话框,这将要求您在用户单击Edit按钮时构建一个新对话框。此时,MVC验证应该已经处于默认状态。如果不是(即,与对话框关联的底层DOM对象仍然包含来自上一次对话框调用的数据),正确的方法是简单地清除DOM对象中的值。感谢您的响应。我已经实现了一个类似的解决方案,但它暴露了一个额外的问题,即当单击“取消”按钮时,文本框会失去焦点,并再次启动验证!在对话框关闭之前,您将看到错误消息。解决这个问题的唯一方法是使用JQuery.Ajax调用将对话框注入到div中,以将部分视图插入到弹出窗口使用的div中。这样,当对话框关闭时,“持久性”将丢失。在调用“重置”功能之前,您不能从文本框中删除焦点吗?或者我在您的设置中遗漏了什么?我在MVC4应用程序中使用了此方法,但它保留了显示的验证错误。添加
$('.validation summary errors li').remove()修复了该问题。在MVC5验证消息中,文本仍然显示,因此我必须使用
$('.field validation error').text('')清除现在一年过去了,我将项目升级到VS2010、MVC3和Razor。出于某些原因,默认情况下,MVC3在使用HTML.BeginForm()helper函数时不再放置“id='form0'”标记。您必须在每个Html.BeginForm()中执行一个新的{id='form0'}。或者您必须将ClientValidationEnabled设置为true,并将UnobtrusiveJavaScriptEnabled设置为false。我最后要做的是修改jQuer