【发布时间】: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