【问题标题】:How to show errors of server validations in bootstrap modal?如何在引导模式中显示服务器验证错误?
【发布时间】:2017-10-31 19:27:42
【问题描述】:

我在引导模式下的服务器验证存在问题。我想用我的表单打开一个模式并提交,但如果我的模型中存在一些错误,我想显示错误消息。我不知道该怎么做。

我的控制器:

public ActionResult NovoComportamento(Guid id)
        {
            ViewBag.Icon = "icon-plus";
            ViewBag.Title = "Novo Comportamento de Componente";

            var comportamentoComponente = new ComportamentoComponenteViewModel();

            comportamentoComponente.ComponenteFormId = id;

            return PartialView("~/Views/ComportamentoComponente/_ComportamentoComponente.cshtml", comportamentoComponente);
        }

        [HttpPost]
        public ActionResult NovoComportamento(ComportamentoComponenteViewModel comportamentoComponenteViewModel)
        {
            var errorList = new List<ValidationError>();

            ViewBag.Icon = "icon-plus";
            ViewBag.Title = "Novo Comportamento de Componente";

            var componenteSalvoNoBanco = _componenteFormAppService.ObterPorId(comportamentoComponenteViewModel.ComponenteFormId);

            if (componenteSalvoNoBanco == null)
            {
                errorList.Add(new ValidationError("Não é permitido adicionar um comportamento a componente que não está salvo na base de dados."));
                return Json(new ActionResponse(false, errorList, comportamentoComponenteViewModel));
            }

            if (ModelState.IsValid)
            {
                var comportamentoReturn = _comportamentoComponenteAppService.Salvar(comportamentoComponenteViewModel, comportamentoComponenteViewModel.ComportamentoComponenteId);

                if (!comportamentoReturn.ValidationResult.IsValid)
                {
                    foreach (var error in comportamentoReturn.ValidationResult.Erros)
                    {
                        errorList.Add(new ValidationError(error.Message));
                    }

                    return Json(new ActionResponse(false, errorList, comportamentoComponenteViewModel), JsonRequestBehavior.AllowGet);
                }

                return Json(new ActionResponse(true, null, comportamentoComponenteViewModel), JsonRequestBehavior.AllowGet);
            }

            return Json(new ActionResponse(true, errorList, comportamentoComponenteViewModel), JsonRequestBehavior.AllowGet);
        }

我的带模态表单的 PartialView:

@model PAD.Application.ViewModels.ComportamentoComponenteViewModel

<div class="modal-dialog">
    <div class="modal-content">
        @using (Ajax.BeginForm(null, null,
                        new AjaxOptions
                        {
                            HttpMethod = "POST",
                            InsertionMode = InsertionMode.Replace
                        },
                        new { id = "comportamentoComponenteFrm", onsubmit = "comportamentoSubmit()" }))
        {
            <div class="card-header modaldialog">
                <button class="close" type="button" data-dismiss="modal">
                    <span class="sr-only">Close</span>
                    <span aria-hidden="true">x</span>
                </button>
                <h4 class="card-title">
                    <span class="@ViewBag.Icon"></span> @ViewBag.Title
                </h4>
            </div>
            <div class="modal-body">
                <div class="card-block">
                    <div class="form-group">
                        <ul id="listaErros"></ul>
                    </div>
                    @Html.HiddenFor(model => model.ComponenteFormId)
                    <div class="form-body">
                        <div class="form-group">
                            @Html.LabelFor(model => model.Tipo)
                            <select class="form-control" name="tipo" id="combotipo">
                                <option value="">-- Selecionar --</option>
                                <option value="A">A - Acessibilidade</option>
                                <option value="P">P - Aparência</option>
                                <option value="V">V - Visibilidade</option>
                            </select>
                        </div>
                        <div class="form-group">
                            @Html.LabelFor(model => model.Condicao)
                            @Html.TextAreaFor(model => model.Condicao, new { @class = "form-control", @rows = "10" })
                        </div>
                        <div class="form-group" id="classe-group">
                            @Html.LabelFor(model => model.Classe)
                            @Html.TextBoxFor(model => model.Classe, htmlAttributes: new { @class = "form-control" })
                        </div>
                    </div>
                </div>
            </div>
            <div class="card-footer">
                <button class="btn btn-warning shadow" type="button" id="voltar-lista-comportamentos">
                    <span class="icon-reply"></span> Voltar
                </button>
                <button class="btn btn-success shadow pull-right" type="submit">
                    <span class="icon-check"></span> Salvar
                </button>
            </div>
        }
    </div>
</div>

@section Scripts{
    @Scripts.Render("~/bundles/jqueryval")
}

<script src="~/Content/js/comportamento-componente.js"></script>

我的javascript:

$(document).ready(function () {

    $("#classe-group").hide();

    $("#combotipo").change(function () {
        var tipo = $("#combotipo").val();

        if (tipo == "P") {
            $("#classe-group").show('slow');
        } else {
            $("#classe-group").hide('slow');
        }
    });

    var componenteFormId = $("#componente-id").val();

    $("#btnNovoComportamento").click(function () {
        var url = "/ComportamentoComponente/NovoComportamento/";
        $("#modal").load(url + componenteFormId, function () {
            $("#modal").modal("show");
        });
    });

    $("#voltar-lista-comportamentos").click(function () {
        var url = "/ComportamentoComponente/ListaComportamentosComponente/";

        if (componenteFormId == "" || componenteFormId == undefined || componenteFormId == null) {
            swal("Erro", "Nenhum componente foi selecionado!", "error");
        } else {
            $("#modal").load(url + componenteFormId, function () {
                $("#modal").modal("show");
            });
        }
    });

    function comportamentoSubmit(event) {
        event.preventDefault();

        $.ajax({
            type: 'POST',
            url: '/comportamentocomponente/novocomportamento',
            data: $("#comportamentoFrm").serialize(),
        }).done(function (result) {
            swal("OK!", "A requisição foi feita.", "success");
            if (result.data != null && !result.data.success) {
                swal("OPS!", "Existem alguns erros.", "error");
                var errors = result.data.errorList;
                $.each(errors, function (key, value) {
                    $("#listaErros").append("<li>" + value + "</li>");
                });
            } else {
                swal("OK!", "Comportamento de Componente cadastrado com sucesso!", "success");
                $("#modal").modal("hide");
                $("#comportamentoFrm").html(result);
            }
        });
    }
});

我知道应该使用 Json,但不知道如何使用 javascript 获取结果并在不关闭模式的情况下在部分视图模式中显示错误。我只想在不存在错误时关闭模态。

这是返回提交:

【问题讨论】:

  • 您遇到了什么样的错误?服务器端发生验证错误或任何错误或异常?您是否在 result.data.errorList 中获取任何数据?你用调试器检查了吗?
  • @ArunprasanthKV 域错误,ModelState 错误......我想进入控制器,在我的域层和模型状态上进行所有必要的验证,如果有什么我不同意,我会喜欢为我的部分模态视图返回这些错误。也就是说,只要有必要显示来自我的控制器的验证错误,我想保持模式打开。
  • 我做错了什么,但我不确定是什么。在表单中提交后,会触发Controller上的Action,当它返回时,它只是一个没有任何格式的JSON字符串。
  • 我们能看到字符串吗?
  • Firstaball 为什么您的 Post 操作 NovoComportamento 不返回 View 而不是 json ?您可以在ModelState 中添加验证错误,并允许您在页面加载时显示包含ValidationSummary() 的模式。

标签: javascript c# jquery ajax asp.net-mvc


【解决方案1】:

我使用类似的东西

在控制器中

 [HttpPost]
    public JsonResult yourMethode(model myModel)
    {
     var errorModel = from x in ModelState.Keys where ModelState[x].Errors.Count > 0 select new { key = x, errors = ModelState[x].Errors[0].ErrorMessage };
                return Json(new { Error = true, Data = errorModel, responseText = "Erreur Model" });
    }

在 jquery ajax 中出错

 error: function (request, error) {
 if (JSON.parse(request.responseText).Data[0] != null) {console.log(JSON.parse(request.responseText).Data[0].errors)}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2017-03-03
    • 2015-07-12
    相关资源
    最近更新 更多