【问题标题】:MVC 3 Ajax.ActionLink with JQuery UI Confirm Dialog带有 JQuery UI 确认对话框的 MVC 3 Ajax.ActionLink
【发布时间】:2011-05-26 03:30:48
【问题描述】:

我有一个调用删除操作的@Ajax.ActionLink。现在我想使用 JQuery UI 对话框确认而不是 Ajax 链接的常规“确认”属性。 我使用不显眼的 javaScript 将事件连接到 Ajax.ActionLink。但是动作被提交并且 e.preventDefault();通过错误。谁能告诉我为什么会这样?

这是我的 jQuery 代码:

 $("[data-dialog-confirm]").click(function (e) {

        e.preventDefault();
        var theHREF = $(this).attr("href");
        $("#dialog-confirm").dialog('option', 'buttons', {
            "Delete this item": function () {
                window.location.href = theHREF;
                $(this).dialog("close");
            },
            "Cancel": function () {
                $(this).dialog("close");
            }
        });
        $("#dialog-confirm").dialog("open");
    });

这是我的 MVC 代码:

    @Ajax.ActionLink("Delete", "DeleteConfirmed", new { id = item.Id },
                    new AjaxOptions
                    {
                        HttpMethod = "POST",
                        OnSuccess = "refreshList"
                    },
                    new {data_dialog_confirm="true" }
                    )

【问题讨论】:

    标签: jquery asp.net-mvc-3


    【解决方案1】:

    这是我使用 jquery UI 实现确认功能的方式:

    $(document).ready( function () {
        $("#dialog-confirm").dialog({
          autoOpen: false,
          modal: true,
          resizable: false,
          height:180,
        });
    
        $(".deleteLink").click(function(e) {
        e.preventDefault();
        var targetUrl = $(this).attr("href");
    
        $("#dialog-confirm").dialog({
            buttons : {
            "Confirm" : function() {
                window.location.href = targetUrl;
            },
            "Cancel" : function() {
                $(this).dialog("close");
            }
            }
        });
    
        $("#dialog-confirm").dialog("open");
        });
    
    } );
    

    在你的 html 中你可以添加对话框 div

    <div id="dialog-confirm" title="Delete the item?" > 
        <p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>This item will be deleted. Are you sure?</p> 
    </div> 
    

    您的操作链接应如下所示

    @Html.ActionLink("Delete", "UpdateDelete", new { id = item.Id }, new { @class = "deleteLink" })
    

    【讨论】:

    • 哈米德感谢您的回复。我做的都是基于ajax的。所以最初我将它作为@Ajax.ActionLink 并且它不会触发警报。所以我将其更改为 Html.ActionLink,然后在我的对话框中关闭 JavaScript 函数,我进行 ajax 调用以删除记录。现在一切正常。
    • @Hamid,很好的解决方案,但是当有参数/对象要发送回服务器时,这应该如何工作?
    【解决方案2】:

    我最终这样做了: 将Ajax.ActionLink 更改为Html.ActionLink 并在我的JavaScript 代码中调用$.get(theHREF, null, function () { refreshList() });

    代码如下:

       $("#dialog-confirm").dialog({
            autoOpen: false,
            resizable: false,
            width: 500,
            modal: true,
            buttons: {
                "Delete this item": function () {
                    $(this).dialog("close");
                },
                Cancel: function () {
                    $(this).dialog("close");
                }
            }
        });
    
        $("[data-dialog-confirm]").click(function (e) {
            e.preventDefault();
            var theHREF = $(this).attr("href");
            $("#dialog-confirm").dialog('option', 'buttons', { "Yes":
            function () {
                $.get(theHREF, null, function () { refreshList() });
                $(this).dialog("close");
            }, "No":
          function () { $(this).dialog("close"); }
            });
            $("#dialog-confirm").dialog("open");
        });
    

    这里是 MVC 3 ActionLink

     @Html.ActionLink("Delete", "DeleteConfirmed", "Category", new { id = item.Id }, new
                        {
                            data_dialog_confirm = "true"
                        })
    

    【讨论】:

      【解决方案3】:

      您可以使用OnBegin 属性而不是OnSuccess,这只是一个简单的示例,但它可以帮助您,这就是我声明Ajax.ActionLink 链接的方式:

      @Ajax.ActionLink("Delete", "DeletePeriod", "ConfigPeriod", 
      new { area = "Budget", id = Model.Id }, new AjaxOptions
      {
          HttpMethod = "Post",
          OnBegin = "confirmDeletion"
      })
      

      这可能是confirmDeletion 函数的一个非常简单的实现:

      <script>
          function confirmDeletion (e) {
              // Do something or validate inputs...
              e.preventDefault(); // This should prevent the event to fire...
          };
      </script>
      

      问候。

      【讨论】:

      • 没有任何事件传递到 confirmDeletion 供您阻止。
      【解决方案4】:

      试试这个:

      $("[data-dialog-confirm]").click(function (e) {
      
          var theHREF = $(this).attr("href");
          $("#dialog-confirm").dialog('option', 'buttons', {
              "Delete this item": function () {
                  window.location.href = theHREF;
                  $(this).dialog("close");
              },
              "Cancel": function () {
                  $(this).dialog("close");
              }
          });
          $("#dialog-confirm").dialog("open");
      
          return false
      });
      

      我还强烈建议您考虑将 HttpDelete 动词与任何 MVC 回发或 Ajax 方法一起使用。

      【讨论】:

      • 菲尔,谢谢你的回复。我累了,还把 httpPost 改成了 HttpDelete。由于这是一个 Ajax.ActionLink 它应该执行 javaScript 事件而不是 window.location.href = theHREF;此行实际上将页面转发到 url /Category/DeleteConfirmed/345 其中 345 是要删除的项目的 id。你知道要在 window.locaiton.href=theHREF 中执行什么 javaScript 吗?
      【解决方案5】:

      也许您可以尝试从 Ajax.ActionLink 的OnBegin 事件调用确认函数?这样您就可以继续使用 Ajax.ActionLink。 OnBegin 甚至被标记为 data-ajax-begin 属性,所以让 jquery 将“return YourConfirmationFunction()”分配给这个属性,你应该没问题。这是一个没有 jquery 的example of using OnBegin for confirmation dialog

      【讨论】:

        【解决方案6】:

        我发现使用包含发布数据的单独表单和显示对话框然后提交表单的按钮更容易做到这一点。

        cshtml(剃刀):

        using (Ajax.BeginForm("Deactivate", "Admin", 
            new AjaxOptions { OnComplete = "ReloadList();" }, 
            new {@id = "deactive-form-" + user.Id }))
        {
        <input type="hidden" name="id" value="@user.Id" />
        }
        <input type="button" class="btn" value="Deactivate" 
            onclick="return ShowConfirmDlgThenSubmitForm('dialog-deactivate', 'deactive-form-@user.Id');" />
        

        javascripts(带有jQuery UI Dialog):

        function ShowConfirmDlgThenSubmitForm(dialogId, formId) {
                $('#' + dialogId).dialog({
                    resizable: false,
                    height: 180,
                    modal: true,
                    buttons: {
                        "Okay": function () {
                            $(this).dialog("close");
                            $('#' + formId).submit();
                        },
                        Cancel: function () {
                            $(this).dialog("close");                        
                        }
                    }
                });
                return false;
            }
        

        【讨论】:

          猜你喜欢
          • 2011-02-27
          • 1970-01-01
          • 2013-03-17
          • 1970-01-01
          • 2012-03-25
          • 2013-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多