MVC 3 Ajax.ActionLink与JQuery UI确认对话框

时间:2011-05-26 03:30:48

标签: jquery asp.net-mvc-3

我有一个调用删除操作的@ Ajax.ActionLink。现在我想使用JQuery UI Dialog确认Ajax链接的常规“Confirm”属性。 我使用不显眼的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" }
                    )

6 个答案:

答案 0 :(得分:13)

以下是我使用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" })

答案 1 :(得分:4)

我最终这样做了: 将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"
                    })

答案 2 :(得分:2)

您使用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>

问候。

答案 3 :(得分:0)

请改为尝试:

$("[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方法一起使用。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

cshtml(Razor):

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;
    }