我在 jquery ui 对话框中显示了一个表单。我使用 ajax 加载表单并使用 ajax 提交表单。
我现在有验证来检查字段是否唯一并且只能在服务器端发生。
所以在我的控制器中,我将任何验证错误添加到 ModelState:
public ActionResult CreateOrEdit(Property p)
{
_Uow.PropertyRepository.InsertOrUpdate(p);
//My unit of work has a method that returns any data layer validation errors
foreach (var error in _Uow.GetValidationErrors())
ModelState.AddModelError(error.Key, error.Value);
if (ModelState.IsValid)
_Uow.Save();
return GetCreateOrEditView(p, "Property");
}
编辑 我返回获取中使用的相同视图,因此行为与字段失败客户端即相同。该对话框包含一个表单,并且验证错误显示在字段旁边,就像其他错误一样。
现在,我不想关闭对话框,并且在对话框的顶部,我有一个使用此助手创建的验证图例:
public static MvcHtmlString ValidationLegend(this HtmlHelper htmlHelper
, string message = "The form is invalid.")
{
string cssClass = htmlHelper.ViewData.ModelState.IsValid ?
"validation-summary-valid" : "validation-summary-errors";
var tagBuilder = new TagBuilder("div");
tagBuilder.Attributes.Add("id", "validation-legend");
tagBuilder.Attributes.Add("data-valmsg-summary", "true");
tagBuilder.SetInnerText(message);
tagBuilder.AddCssClass(cssClass);
return new MvcHtmlString(tagBuilder.ToString());
}
因此,如果出现服务器错误,此帮助程序将显示带有此 html 的图例:
<div class="validation-summary-errors" data-valmsg-summary="true"
id="validation-legend">The form is invalid.</div>
所以它就像一个没有所有额外消息的验证摘要 - 我在我的 javascript 中使用摘要的存在来阻止对话框关闭。
我想发生两件事:1.当用户使用服务器端错误消息更改字段时,字段旁边的验证错误应该清除(无论更改为什么,因为我无法在服务器端检查它) 2. 验证图例应在任何验证失败时显示,并在清除所有无效字段时隐藏。
目前,图例仅显示服务器验证错误,并且图例和字段错误都保留在屏幕上,直到单击提交按钮 - 这与客户端验证不一致。
作为不显眼的验证的一部分,我是否可以添加其他数据属性来实现这一点?还是有其他解决方案?
这是我的javascript:
function submitDialogForm(successCallback) {
var $dialog = $(this);
var $form = $dialog.find("form").filter(':visible:first');
if ($form.find("input:first").length > 0) {
if ($form.updateValidation().valid()) {
var $target = getTarget($dialog);
$form.ajaxSubmit({
target: $target,
success: function () {
$target.find(".fadein").show();
//Check if server side validation has failed before closing
$form = $dialog.find("form").filter(':visible:first');
if ($form.find("#validation-legend.validation-summary-errors").length > 0) {
return;
}
if (successCallback && typeof (successCallback) === "function") {
successCallback();
}
else {
$dialog.dialog("close");
}
}
});
}
}
else {
$dialog.dialog("close");
}
}
包含完整性 - 使用 Ajax 加载表单后验证表单的代码。基于这个答案:在ajax调用后更新不显眼的验证
//jQuery plugin for updating unobtrusive validation when forms are loaded using Ajax
(function ($) {
$.fn.updateValidation = function () {
//If the form has been loaded via ajax, then we have to update the
//unobtrusive validation
var $this = $(this);
var form = $this.closest("form")
.removeData("validator")
.removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse(form);
return $this;
};
})(jQuery);