【问题标题】:Add validation errors to existing form with javascript?使用 javascript 向现有表单添加验证错误?
【发布时间】:2012-12-15 00:42:29
【问题描述】:

我有一个 ASP.NET MVC 4,我在其中使用带有验证属性的客户端和服务器端验证。

在使用 ajax 发送表单之前,将正确验证表单,如下所示:

function ValidateFormAndAjaxSubmit(formId, callingElement) {

    if (IsNotDblClick(callingElement.id)) {
        var _form = $("#" + formId);

        var validator = _form.validate();
        var anyError = false;

        _form.find("input").each(function () {
            if (!validator.element(this)) { // validate every input element inside this step
                anyError = true;
            }
        });

        if (anyError) {
            window.latestClick = '';
            return false; // exit if any error found    
        }

        $.post(_form.attr("action"), _form.serialize(), function (data) {

            if (data.Success) {

            }
            else {

            }

            alert("Win");
            window.latestClick = '';
            //check the result and do whatever you want
        })
    }
}

表格如下所示:

@using (Html.BeginForm("JEdit", "Post", FormMethod.Post, new { id = "frmEditPost" }))
{
    @Html.ValidationSummary(true)
    ...
}

将在服务器端进行额外的验证,并将其存储在这样的返回类中:

public class JEditResult
    {
        public Boolean Success = false;
        public string TitleErrMessage;
        public string TextErrMessage;
        public string LinkErrMessage;
        public string TagErrMessage;
        public string OtherErrMessage;
    }

现在我需要将这些验证放入表单中,就好像它们已在客户端上进行了验证一样。我该怎么做?

【问题讨论】:

  • 您是否在使用模型绑定并且是否已向模型添加了验证属性?您可能不希望像使用 JEditResult 创建的那样拥有自己的结果类。看起来您正在复制 MVC 内置的功能。您可以发布您的模型和操作方法的代码吗?
  • 摆脱所有输入循环业务,只需使用valid()。另外仅供参考 - 它是“服务器”而不是“服务” - 就像网络 服务器。明白了吗?
  • @jesus.tesh 谢谢,工作正常,但如何处理返回验证的主要问题尚未解决。

标签: jquery ajax asp.net-mvc json validation


【解决方案1】:

我使用以下扩展方法:

public static JsonResult JsonValidation(this ModelStateDictionary state, JsonRequestBehavior behavior = JsonRequestBehavior.DenyGet) {
    var result = new JsonResult {
        Data = new {
            success = false,
            Tag = "ValidationError",
            State = from e in state
                    where e.Value.Errors.Count > 0
                    select new {
                        Name = e.Key,
                        Errors = (e.Value.Errors.Select(x => x.ErrorMessage)
                            .Concat(e.Value.Errors.Where(x => x.Exception != null).Select(x => x.Exception.Message)))
                            .Where(x => !String.IsNullOrEmpty(x)).Select(x => x)
                    }
        }
    };
    result.JsonRequestBehavior = behavior;
    return result;
}

然后像这样在我的代码中使用它:

if (ModelState.IsValid == false) {
    Response.StatusCode = 400;
    return ModelState.JsonValidation();
}

我也有一些我使用的标准 js 代码:

// JSON validation
function validateResponse(form, response) {
    var data = getResponseValidationObject(response);
    if (!data) return true;

    var validator = form.validate();
    var container = form.find("[data-valmsg-summary=true]");
    var list = container.find("ul");
    if (!list) return;

    container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
    list.empty().show();
    $.each(data.State, function (i, item) {
        list.append("<li>" + item.Errors.join("</li><li>") + "</li>");
    });
    return false;
}

// JSON validation
function getResponseValidationObject(response) {
    if (response && response.Tag && response.Tag == "ValidationError")
        return response;
    return null;
}

然后在我的 ajax 帖子中检查返回响应的有效性:

var json = $.parseJSON(response.responseText);
var isValid = validateResponse($("#form"), json);
// Do something here...

validateResponse 函数会自动将错误添加到表单验证摘要(假设有一个)。

【讨论】:

  • 这看起来像是我正在寻找的解决方案!不错的作品。我试试看
  • 谢谢。 :) 它工作得很好,我相信它也会对你有用。
  • 我发现我的代码有问题,因为我们将StatusCode设置为400,所以不会触发内部post函数(我认为)我应该如何处理?我可以忽略 StatusCode 吗?还是 jquery.post 有错误功能?
  • 是的,$.post 有 .error() - 它基本上只是带有“POST”预设的 $.ajax。但它的行为方式相同。但是,由于您知道初始 post return 的有效性,您可能可以跳过状态代码,它仍然可以为您工作。
猜你喜欢
  • 1970-01-01
  • 2014-04-05
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2016-09-05
  • 2011-05-17
  • 1970-01-01
相关资源
最近更新 更多