繁体   English   中英

ASP.NET MVC 3中的手动远程验证

[英]Manual Remote Validation in ASP.NET MVC 3

在我遇到的一种情况下,需要进行远程验证以确保不再输入字段。

可以使用ASP.NET MVC 3远程验证来完成此操作,但是,此方法可以完美地用于创建记录的形式,而不是用于编辑记录的形式,否则它将始终为我提供帮助该记录已存在的错误。

因此,对于此“编辑”表单,我需要发送“ Id / Name”列以验证是否存在具有相同名称的另一条记录,换句话说,我是否还有其他记录“ ID以外的其他记录”具有相同的“ Name” “?

服务器端逻辑运行完美,问题在于jQuery在jQuery UI对话框中显示错误。 我遵循jquery.validate.unobstrusive.js使用的相同方法。

在视图本身上,我正在运行以下命令:

$(document).ready(function () {
        RemoteValidate({
            formName: "CultureEditForm",
            inputName: "Name",
            inputId: "CultureId",
            url: "/Culture/CultureEditNameExists",
            dupTmpl: "dupTmpl"
        });
    });

RemoteValidate()函数如下:

RemoteValidate = function (options) {    
    $('#' + options.formName + ' input[name=\"' + options.inputName + '\"]').live('blur', function () {
        var params = {
            name: $('#' + options.formName + ' input[name=\"' + options.inputName + '\"]').val(),
            id: $('#' + options.formName + ' input[id$=\"' + options.inputId + '\"]').val()
        }

        $.ajax({
            url: options.url,
            type: "POST",
            data: JSON.stringify(params, null, 2),
            contentType: "application/json; charset=utf8",
            dataType: "json",
            success: function (response) {
                if (!response) {
                    _onError(options.formName, options.inputName);
                }
                else {
                    _onSuccess(options.formName, options.inputName);
                }
            }
        });        
    });

    function _onError(formId, inputElement) {
        var container = $('#' + formId).find("[data-valmsg-for='" + inputElement + "']"),
            replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false;

        container.removeClass("field-validation-valid").addClass("field-validation-error");

        if (replace) {
            container.empty();
            $('Name already exists').appendTo(container);
        }
    }

    function _onSuccess(formId, inputElement) {
        var container = $('#' + formId).find("[data-valmsg-for='" + inputElement + "']"),
            replace = $.parseJSON(container.attr("data-valmsg-replace"));

        if (container) {
            container.addClass("field-validation-valid").removeClass("field-validation-error");

            if (replace) {
                container.empty();
            }
        }
    }
}

只要对话框窗口处于打开状态,我都会继续尝试输入值,并且它会显示“显示/隐藏”错误消息。

但是,当我关闭对话框,然后单击另一个记录进行编辑时,它将再次使用新值打开对话框,但是,当它尝试向服务器发送请求以检查数据库中是否存在记录时, 它正在发送上一个的数据正在编辑的记录

我在上面准备要发送到服务器的对象的行中加了粗体。

有什么帮助吗?

谢谢

处理动态视图或任何其他HTML内容始终被视为特殊情况且敏感。 我必须更改访问事件处理程序中的数据字段的方式,才能使其正常工作。

看起来,jQuery始终在读取已加载的第一个HTML View的旧值。 为了使其动态并读取与所显示的视图相关的数据,我必须编写以下内容:

$('.rm-field').live('blur', function () {
        if ($(this).next()) {
            var params = {
                name: $(this).val(), id: $('input:last-child', $(this).parents('form')).val()
            }

            var element = $(this);
            var container = $(this).next();
            var url = element.parents('form').attr('data-rm-url');

            $.ajax({
                url: url,
                type: "POST",
                data: JSON.stringify(params, null, 2),
                contentType: "application/json; charset=utf8",
                dataType: "json",
                success: function (response) {
                    if (!response) {
                        if (container) {
                            container.removeClass("field-validation-valid").addClass("field-validation-error");
                            container.empty();
                            $('Name already exists').appendTo(container);
                        }
                    }
                    else {
                        if (container) {
                            container.addClass("field-validation-valid").removeClass("field-validation-error");
                            container.empty();
                        }
                    }
                }
            });
        }
    });

我必须向每个输入字段添加一个类.rm-field ,然后将其附加到blur事件 ,之后我便可以获取输入字段的值。

我还需要访问隐藏的域cultureId,但是jQuery一直在访问第一个View HTML,所以这不好。 相反,我所做的是我使用了Parents()导航选择器,到达表单,然后获取最后一个孩子,在我的情况下,这是隐藏字段,其中包含正在编辑的记录的ID。

之后,简单的DOM操作即可添加/删除错误消息。

HTH,问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM