首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ajax.BeginForm无缘无故触发OnFailure

Ajax.BeginForm无缘无故触发OnFailure
EN

Stack Overflow用户
提问于 2020-07-13 18:08:57
回答 1查看 130关注 0票数 0

我遇到了一个(似乎是)简单的问题。

我的目标是创建一个带有Ajax表单的模型。子操作在局部视图中获取模式,编辑后,submit按钮将发布Ajax表单,该表单仅返回Json数据。Ajax.BeginForm中的内置代码应根据操作的结果触发OnSuccess或OnFailure。

问题是OnFailure被触发了,而OnSuccess没有被触发,尽管操作结束时是OK的,post返回了200代码。OnFailure函数中的"data“参数包含整个页面的超文本标记语言。

代码如下:

(1)在主视图中加载模式的代码片段:

代码语言:javascript
运行
复制
<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
     @Html.Action("GetDialogV2", "Fianzas", new { idArrendamiento = Model.Id_Arrendamiento })
</div>

(2)在主视图中打开模式的按钮:

代码语言:javascript
运行
复制
<button type="button" class="btn btn-outline-primary" data-toggle="modal" data-target="#exampleModal">
      <i class="far fa-hand-holding-usd"></i>&nbsp;Modal
</button>

(3)带有模式(和Ajax表单)的部分视图,GetDialogV2.cshtml:

代码语言:javascript
运行
复制
@model EditFianzas_vm

@{
    AjaxOptions ajaxOptions = new AjaxOptions
    {
        HttpMethod = "POST",
        UpdateTargetId = "Respuesta",
        OnSuccess = "OnSuccess",
        OnFailure = "OnFailure"
    };
}

@using (Ajax.BeginForm(ajaxOptions))
{
    @Html.AntiForgeryToken()

    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title">Fianza</h4>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <div class="form-horizontal">
                    @Html.ValidationSummary(true)
                    @Html.HiddenFor(model => model.Id_Arrendamiento)

                    <div class="form-group">
                        @Html.LabelFor(model => model.Importe, new { @class = "control-label col-md-6" })
                        <div class="col-md-8">
                            <div class="input-group">
                                <div class="input-group-prepend">
                                    <span class="input-group-text"><i class="far fa-euro-sign"></i></span>
                                </div>
                                @Html.EditorFor(model => model.Importe, new { htmlAttributes = new { @class = "form-control importe" } })
                            </div>
                            @Html.ValidationMessageFor(model => model.Importe, "", new { @class = "text-danger" })
                        </div>
                    </div>
                    <div class="form-group">
                        @Html.LabelFor(model => model.Fecha_Abono, new { @class = "control-label col-md-6" })
                        <div class="col-md-8">
                            <div class="input-group">
                                <div class="input-group-prepend">
                                    <span class="input-group-text"><i class="far fa-calendar"></i></span>
                                </div>
                                @Html.TextBoxFor(model => model.Fecha_Abono, "{0:dd/MM/yyyy}", new { @class = "form-control datepicker" })
                            </div>
                            @Html.ValidationMessageFor(model => model.Fecha_Abono, "", new { @class = "text-danger" })
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-md-8">
                            <input type="text" id="Respuesta" class="form-control" />
                        </div>
                    </div>
                </div>
            </div>
            <div class="modal-footer justify-content-between">
                <button type="button" class="btn btn-default" data-dismiss="modal">Cancelar</button>
                <button type="submit" class="btn btn-primary" id="botonPrueba">Guardar</button>
            </div>
        </div>
        <!-- /.modal-content -->
    </div>
}

(4)主视图中的Javascript:

代码语言:javascript
运行
复制
@section scripts
{
    <script type="text/javascript">
        function OnSuccess(data) {
            if (data.Success == true) {
                toastr.success("Operación realizada.", "Fianzas");
                $("#exampleModal").modal('hide');
            }
            else {
                if (data.modelState) {
                    $.each(d.modelState, function (i, item) {
                        toastr.info(i + ': ' + item, "i: item");
                        //item.valid(); //run jQuery validation to display error
                        $('#' + i).valid();
                    });
                }
                else {
                    toastr.error(data.Error, "Fianzas");
                }
            }
        }

        function OnFailure(data) {
            alert(data);
            alert('HTTP Status Code: ' + data.param1 + '  Error Message: ' + data.param2);
            toastr.error("Se ha producido un error no controlado al realizar la operación.", "Fianzas");
            toastr.warning(data, "Fianzas");
        }
    </script>
}

(5)最后,控制器:

代码语言:javascript
运行
复制
#region Ajax Form (GetDialogV2)
public PartialViewResult GetDialogV2(int idArrendamiento)
{
    //Obtengo el modelo...
    Arrendamientos_Fianzas fianza = db.Arrendamientos_Fianzas.Find(idArrendamiento);
    //Creo la vista-modelo...
    EditFianzas_vm vm = new EditFianzas_vm {
        Id_Arrendamiento = idArrendamiento,
        Importe = fianza.Importe,
        Fecha_Abono = fianza.Fecha_Abono
    };

    return PartialView(vm);
}

[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult GetDialogV2(EditFianzas_vm vm)
{
    try
    {
        if (!ModelState.IsValid)
        {
            var modelState = ModelState.ToDictionary
            (
                kvp => kvp.Key,
                kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray()
            );
            modelState.Add("hdId_Arrendamiento", modelState["vm.Id_Arrendamiento"]);
            modelState.Remove("vm.Id_Arrendamiento");
            modelState.Add("txtImporte", modelState["vm.Importe"]);
            modelState.Remove("vm.Importe");
            modelState.Add("txtFecha_Abono", modelState["vm.Fecha_Abono"]);
            modelState.Remove("vm.Fecha_Abono");
            return Json(new { modelState }, JsonRequestBehavior.AllowGet);
            //throw (new Exception("Error en la validación del modelo."));
        }
        //Miro a ver si existen datos para este arrendamiento (no sé si es un edit o un new, si quiero hacerlo todo en una misma acción)
        Arrendamientos_Fianzas fianza = db.Arrendamientos_Fianzas.Find(vm.Id_Arrendamiento);
        //Compruebo si es nuevo o editado...
        if (fianza == null)
        {
            //Nuevo registro...
            fianza = new Arrendamientos_Fianzas
            {
                Id_Arrendamiento = vm.Id_Arrendamiento,
                Importe = vm.Importe,
                Fecha_Abono = vm.Fecha_Abono
            };
            //Actualizo info de control...
            fianza.C_Fecha = DateTime.Now;
            fianza.C_IdUsuario = Usuario.NombreUsuario;
            fianza.C_Comentarios = "Alta de la fianza.";
            //Guardo registro...
            db.Arrendamientos_Fianzas.Add(fianza);
        }
        else
        {
            //Estoy editando, grabo valores...
            fianza.Importe = vm.Importe;
            fianza.Fecha_Abono = vm.Fecha_Abono;
            //Actualizo info de control...
            fianza.C_Fecha = DateTime.Now;
            fianza.C_IdUsuario = Usuario.NombreUsuario;
            fianza.C_Comentarios = "Modificación de los datos de la fianza.";
            //Modifico estado del registro en el modelo...
            db.Entry(fianza).State = EntityState.Modified;
        }
        //Guardo cambios...
        db.SaveChanges();
        //Return...
        return new JsonResult() { Data = Json(new { Success = true }) };
    }
    catch (Exception ex)
    {
        return new JsonResult() { Data = Json(new { Success = false, Error = ex.Message }) };
    }
}
#endregion

非常感谢您的时间和帮助。

最好的问候,费尔南多。

EN

回答 1

Stack Overflow用户

发布于 2020-07-14 15:35:46

这样啊,原来是这么回事。这是一个微妙的解决方案,因为我几乎猜不到:

如果Javascript被禁用,或者在某些情况下,您需要显式地将操作传递给AjaxOptions,如下所示:

代码语言:javascript
运行
复制
    AjaxOptions ajaxOptions = new AjaxOptions()
    {
        HttpMethod = "POST",
        OnSuccess = "OnSuccess(data)",
        OnFailure = "OnFailure",
        OnBegin = "OnBegin",
        OnComplete = "OnComplete",
        Url = Url.Action("GetDialogV2")
    };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62873604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档