[英]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.