【问题标题】:How can I get my Popup to close on submit button from AJAX call in ASP.NET MVC?如何让我的弹出窗口在 ASP.NET MVC 中的 AJAX 调用中关闭提交按钮?
【发布时间】:2019-06-12 13:46:26
【问题描述】:

我有一个列出一堆项目的视图。我正在尝试做到这一点,以便当用户单击这些项目之一(来自表格行)的“动作事件”时,将出现一个弹出窗口。然后,用户可以更新有关此项目的相同信息,并提交信息或关闭它。无论他们选择哪个选项,我都会尝试关闭弹出窗口。

我已经完成了 90%,但我似乎无法解决一个小细节 - 按下提交按钮后关闭弹出窗口!我看到的许多解决方案似乎都不起作用,而且我似乎在调整它们以解决我的问题时遇到了一些麻烦。鉴于以下代码,我需要做哪些更改才能使其正常工作?

这是我所拥有的:

查看

Index.cshtml

<table>
@foreach (var item in Model)
    <tr>
        <td colspan="5" align="right">
                <a href="javascript:void(0);" class="anchorDetail" data-id="@item.AID">Action Event</a>
            </td>
        </tr>
    }
</table>


<div id="myModal" class="modal">
    <div class="modal-dialog">
        <div class="modal-content">
            <div id="myModalContent"></div>
        </div>
    </div>
</div>

<script>
    var TeamDetailPostBackURL = '/Database/Edit';
        $(function () {
                $(".anchorDetail").click(function () {
                        var $buttonClicked = $(this);
                        var id = $buttonClicked.attr('data-id');
                        var options = { "backdrop": "static", keyboard: true };
                        $.ajax({
                                type: "GET",
                                url: TeamDetailPostBackURL,
                                contentType: "application/json; charset=utf-8",
                                data: { "Id": id },
                                datatype: "json",
                                success: function (data) {
                                        $('#myModalContent').html(data);
                                        $('#myModal').modal(options);
                                        $('#myModal').modal('show');                   

                                },
                                error: function () {
                                        alert("Dynamic content load failed.");                    
                                }
                        });
                });
        });

</script>

弹出视图

Edit.cshtml

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

    <div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.AID)
        <table>
        <tr>
         <td>@Html.LabelFor(model => model.Comment)</td>
         <td>@Html.TextAreaFor(model => model.Comment, new { @class = "form-control", rows = "5" })</td>
        </tr>
        <tr>
         <td><input type="submit" value="Save" class="btn btn-primary" id="btnSave"/></td>
         <td><button type="button" class="btn btn-primary" data-dismiss="modal">Cancel</button></td>
        </tr>
    </table>
     </div>
}

控制器

DatabaseController.cs

    public ActionResult Index()
    {
        return View(db.ActionableEvents.ToList());
    }

    public ActionResult Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        ActionableEvents actionableEvents = db.ActionableEvents.Find(id);
        if (actionableEvents == null)
        {
            return HttpNotFound();
        }
        return View(actionableEvents);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "AID,Comment")] ActionableEvents actionableEvents)
    {
        if (ModelState.IsValid)
        {
            db.Entry(actionableEvents).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(actionableEvents);
    }

我确实在这里看到了这个资源:asp.net submit button close Jquery Ajax,但我只是不知道如何将其调整为我现在正在做的事情。

我现在拥有的取消按钮可以正常工作。有什么方法可以为我的提交按钮使用数据关闭并让它仍然像我为取消按钮一样保存数据?我还看到一些解决方案在提交按钮中使用了 onClick() 参数,但随后它会使用 window.close() 选项。我不想关闭整个窗口,也不想提示用户。

有什么好的方法可以解决这个问题?我希望我的提交按钮像我的取消按钮一样工作,只保存数据。提前感谢您的任何建议!!!

【问题讨论】:

  • 我注意到您使用的是Html.BeginForm,那么如何在不刷新页面的情况下发布模态数据?通常Ajax.BeginForm 用于在不刷新页面的情况下发布表单。如果您想在表单的发布成功时绑定事件,这一点很重要。
  • 嗯,在此之前,页面不是一个弹出窗口,而是一个实际的视图。当用户单击保存时,它将从控制器重定向。实际上,您仍然可以在控制器中看到 RedirectToAction("Index") 调用。显然,一旦我实现了这个弹出窗口,我就不会调用这个 RedirectToAction。有没有更好的方法可以发布我的数据?不知道如何使用 Ajax.BeginForm 来解决这个问题,但我会同时开始寻找。
  • 是的,我会做以下@using (Html.BeginForm(null, null, FormMethod.Post, new {@id="_id"}) 然后有一个jquery 函数preventsDefault 一旦点击表单中的提交按钮就会触发。在这里你可以隐藏/切换模式
  • JamesS,我对如何隐藏/切换模式有点困惑。从我的弹出视图 (Edit.cshtml) 中工作,我更改了 @using 以匹配您发布的内容。然后,根据您的建议,在单击按钮后(再次,在我的 Edit.cshtml 文件中),我使用 jquery 来防止Default()。但是,我不明白如何切换模式。这是我需要在我的 Index.cshtml 文件中做的事情吗?如果是这样,我怎样才能让我的弹出视图与我的 Index.cshtml 文件通信以切换模式?

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


【解决方案1】:

您能否在Index.cshtml 中尝试以下操作(确保您为表单设置了一个 ID 并在下方更正):

$("form").submit(function(){
   $('#modal').modal('toggle');
});

如果您想向服务器发出 AJAX 请求并保存数据,您可以执行以下操作(只需将以下代码包含在模态关闭按钮上的单击事件中):

$.ajax({
    type: "POST",
    url: "SaveData",
    content: "application/json; charset=utf-8",
    dataType: "json",
    data: JSON.stringify(data),
    success: function (result) {
        // do something
    },
    error: function (result) {
        // do something
    }
});

并且有一个类似于以下的 MVC 操作:

[HttpPost]
public JsonResult SaveData()
{
    // save data
}

编辑: 在第二次阅读您的问题后,您需要将 Edit.cshtml 设为部分视图,然后在 Index.cshtml 上将您的部分视图包含在模态的 div 中,如下所示:

<div id="myModal" class="modal">
    <div class="modal-dialog">
        <div class="modal-content">
            @Html.Partial("_EditView")
        </div>
    </div>
</div>

你的 JS 应该是这样的:

$("form").submit(function () {
    e.preventDefault();

    formData = $(this).serialize();

    $.ajax({
        type: "POST",
        url: "SaveData",
        content: "application/json; charset=utf-8",
        dataType: "json",
        data: formData ,
        success: function (result) {
            // do something
        },
        error: function (result) {
            // do something
        }
    });

    $('#modal').modal('toggle');
});

JS 应该在 Index.cshtml 中,因为那是你的部分存在的地方,试试吧,你会看到的。

【讨论】:

  • 感谢您的回复,iamdlm!我仍然有点不清楚如何将此代码放入我的 Index.cshtml 文件中。表单本身实际上包含在 Edit.cshtml 文件中,所以此代码不应该也在那个 Edit.cshtml 文件中吗?此外,我并不是特别喜欢使用 AJAX - 我可以选择最简单的方法。 AJAX 是我唯一可以工作的东西,它可以让我有一个使用视图的弹出窗口。我愿意处理任何事情,只要我能得到一个加载视图的弹出窗口,该视图又可用于编辑该行的数据并保存它(无需重新加载页面)。
  • 查看我的编辑。您需要使用 Edit.cshtml 中的内容制作部分内容,并将 JS 包含在 Index.cshtml 中。
  • 感谢您的澄清!我仍然有一些问题 - 对于创建局部视图,现在我只有
    ,但是我究竟应该在
    标签之间放置什么来将局部视图呈现为一个弹出窗口?此外,您的 AJAX 代码使用 $("form").submit。但是,表格仍然在我的局部视图中。如何从我的 Index.cshtml 中引用它?我知道如何与@{Html.RenderPartial) 通信,但不确定如何通过弹出窗口处理这个问题。很抱歉一直在为此苦苦挣扎!!!
  • 你不需要那个 div,看我更新的编辑。基本上你只需要复制粘贴即可。
  • iamdlm,非常感谢您的帮助!尽管我使用的解决方案与您发布的解决方案不同,但我今天能够使其正常工作。感谢您抽出宝贵时间帮助我!我已经发布了我最终使用的解决方案。
【解决方案2】:

所以,在玩了很多之后,我想出了以下解决方案:

查看

Index.cshtml

<table>
@foreach (var item in Model)
    <tr>
            <td>
                <button class="btn btn-primary" onclick="ActionAway(@item.AID)">Action Event</button>
            </td>
    </tr>
    }
        </tbody>
</table>

<div class="modal fade" id="myModal1">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <a href="#" class="close" data-dismiss="modal">&times;</a>
                <h3 class="modal-title">Action This Event</h3>
            </div>
            <div class="modal-body" id="myModalBodyDiv1">

            </div>
        </div>
    </div>
</div>
</div>

<script>
    var ActionAway = function (theid) {
        var url = "/Database/Edit?id=" + theid;

        $('#myModalBodyDiv1').load(url, function () {
            $('#myModal1').modal("show");
        })
    }

</script>

弹出式视图

Edit.cshtml

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

    <div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.AID)
        <table>
        <tr>
         <td>@Html.LabelFor(model => model.Comment)</td>
         <td>@Html.TextAreaFor(model => model.Comment, new { @class = "form-control", rows = "5" })</td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="Save" class="btn btn-primary" id="btnSave"/>
                <button type="button" class="btn btn-primary" data-dismiss="modal">Cancel</button>
        </td>
        </tr>
    </table>
     </div>
}


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

<script>
    $(document).ready(function () {
    $("#btnSave").click(function () {
        $.ajax({
            success: function () {
                $("#myModal").modal("hide");
            }
        })
    })
})
</script>

我能够在不进行任何更改的情况下保持原样的控制器。再次感谢大家的帮助!

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签