Предотвращение множественных представлений в MVC - PullRequest
3 голосов
/ 29 августа 2011

В этот вопрос отключение кнопки отправки для предотвращения множественных обратных передач было жизнеспособным решением для предотвращения (не злонамеренных) пользователей повторной публикации несколько раз.

Эта опция не работаетхорошо, если у вас есть представление с несколькими кнопками отправки.Возьмите следующий пример.

// Представление:

@using (Html.BeginForm("Catalog", "Images", FormMethod.Post, new { onsubmit = "Utility.disable_buttons(this.id);", id = "catalog_form" }))
{
<p>
    <input type="submit" name="btnSubmit" value="Clear" /> |
    <input type="submit" name="btnSubmit" value="Catalog" /> |
    <input type="submit" name="btnSubmit" value="Update" /> |
    @Html.ActionLink("Back to List", "Index")
</p>
}

// Контроллер:

[HttpPost]
    public ActionResult Catalog(string btnSubmit)
    {
        switch (btnSubmit)
        {
            case "Catalog":
                //More differenter code
                break;
            case "Clear":
                //Different code
                break;
            case "Nothing":
                //Code
                break;
        }
        return View();
    }

В представлении есть три различных действия отправки.Если кнопки отключены, их значения не будут переданы, и контроллер не будет знать, какая кнопка вызвала отправку.(Контроллер всегда получает значение NULL.) К сожалению, атрибут submitdisabledcontrols, похоже, не решает эту проблему в MVC.Кто-нибудь знает, как передать на сервер значения отключенного элемента управления?

Ответы [ 2 ]

2 голосов
/ 07 января 2012

Некоторая справочная информация:

Если вы хотите отключить все кнопки, чтобы они больше не нажимались, но все же хотите знать, что пользователь нажал на единственное решение, которое яМожно думать, это скрытое поле вместе с этим кодом:

$(function() {
    $('input[type=submit]').click(function() {
        var form = $(this).closest('form');
        form.find('#hiddenField').val($(this).val());
        form.find('input[type=submit]').prop('disabled', true);
    });
});

Если вы просто хотите убедиться, что пользователь не может нажимать другие кнопки после нажатия одной из них, вы можете сделать это:

$(function() {
    $('input[type=submit]').click(function(event) {
        $(this).closest('form').find('input[type=submit]').not(this).prop('disabled', true);
    });
});

К сожалению, не существует решения (я знаю), чтобы связать обработчик с отправкой формы и определить, по какому вводу была нажата кнопка.Это не проблема, связанная с вашим вопросом, но она немного усложняет приведенный выше код.

0 голосов
/ 29 августа 2011

вы можете попробовать это

if (coll.AllKeys.Contains("Clear"))
{
  // your code here for this submit
}
...