Как не допустить, чтобы повторные обратные передачи запутали мой бизнес-уровень

У меня есть веб-приложение (ASP.Net 3.5) с обычным трехуровневым дизайном. Если пользователь нажимает кнопку, происходит обратная передача, выполняется некоторый код среднего уровня и уровня данных, и экран обновляется. Если пользователь нажимает кнопку несколько раз до завершения первой обратной передачи, моя логика сбивается, и приложение может оказаться в недопустимом состоянии. Как лучше всего этого избежать?

Я могу использовать javascript, чтобы отключить кнопку, но это просто скрывает проблему. Как мне создать свой бизнес и уровни данных, чтобы справиться с этим?


person Sisiutl    schedule 26.01.2009    source источник
comment
Некоторое время назад я спрашивал нечто подобное ... stackoverflow.com/questions/305684/   -  person Marty    schedule 27.01.2009


Ответы (7)


Три самых популярных метода (которые часто используются в тандеме):

  1. Отключить кнопки отправки после нажатия / прессованный;
  2. Используйте POST + REDIRECT + GET, чтобы избежать проблем с кнопкой возврата; и
  3. Заменить историю в браузере, чтобы вы не могли вернуться (но это следует использовать экономно и по уважительной причине).
person cletus    schedule 26.01.2009
comment
Метод 3 - мертвая ссылка - person DaveRead; 27.08.2019

Если быть предельно честным, я бы сказал, что это похоже на то, что вас смущает веб-постбэк, а не ваше приложение (если это вы его написали). ;-)

Тем не менее, в дополнение к другим предложениям, в этом случае я бы поместил «токен» в скрытое поле формы - например, GUID - которое отправляется обратно. Используйте это, чтобы отслеживать выполняемую работу, и разрешите использовать ее только один раз. Например. когда отправлено обратно, поместите его в хранилище сеанса. Каждый раз, когда выполняется обратная передача, сначала проверяйте сеанс на этот токен, и если он там есть, ничего не делайте. Если его нет, сохраните его в сеансе и выполните работу. По окончании сеанса токены автоматически выбрасываются. Легкий. Намного лучше, чем какой-нибудь запутанный токен базы данных.

  • Oisin
person x0n    schedule 26.01.2009
comment
Я делаю что-то очень похожее с memcached для токена. Включите GUID в качестве скрытого поля в форме, а затем, когда он будет опубликован, попробуйте ДОБАВИТЬ его в memcached. Если добавить не удалось, значит, он уже был добавлен, поэтому ничего не делайте. Срок действия ключей истекает через короткое время, и memcached ненадежен, но я уже реализовал перенаправление после публикации, и мне просто нужно что-то для обработки случайного двойного щелчка кнопки отправки (обычно больших боссов ... ) - person Matt Miller; 02.02.2010

  1. После нажатия отключить кнопку отправки. Это предотвратит случайный двойной щелчок или более
  2. Я обычно перенаправляю на другой URL после обратной передачи, чтобы избежать случайного / преднамеренного обновления страницы.
  3. Наконец, в методе вставки базы данных проверьте наличие идентичных данных, вставленных в течение определенного периода времени (возможно, в секундах), прежде чем выполнять вставку. Если обнаруживаются дублирующиеся данные, вставленные в течение нескольких секунд (или минут. В зависимости от того, что имеет наибольший смысл в вашей ситуации), покажите предупреждающее сообщение и попросите пользователя снова нажать кнопку «Отправить», если пользователь считает, что это не ошибка. (Этот метод имеет наибольший смысл, когда у вас есть учетная запись пользователя, и пользователь отправляет данные при входе в систему, поэтому для пользователя выполняется проверка дубликатов данных.)
person Brian Kim    schedule 26.01.2009

Посмотрите этот элемент управления AJAX ASP.NET под названием PostBack Ritalin от другого SO'r Дэйв Уорд.

person Gavin Miller    schedule 07.04.2009

Я решил проблему написания javascript, отключающего кнопку функции щелчка:

MyButton.Attributes.Add("onclick",
    "javascript:this.onclick=function(){return false;};");
person Community    schedule 23.07.2009

Мы все видели веб-сайты, которые отключают кнопки «отправить», когда вы нажимаете на них. Часто это делается для того, чтобы пользователи не нажимали кнопку несколько раз. Обычно это достигается с помощью события JavaScript onclick для отключения кнопки. В ASP.NET каждый элемент на стороне сервера уже имеет обработчик событий onclick, который вызывает сервер для обработки событий. Чтобы добиться того же в ASP.NET, вы можете легко сделать:

btnSubmit.Attributes.Add("onclick", "this.disabled=true;" + GetPostBackEventReference(btnSubmit).ToString());

Где «btnSubmit» - название рассматриваемой кнопки. Здесь происходит следующее: мы создаем событие onclick, которое выполняет две функции. Во-первых, это отключает кнопку в браузере пользователя. Во-вторых, он отправляет на сервер обычное событие обратной передачи.

person yeasir007    schedule 09.05.2012

Даже у меня возникла та же проблема, которую я решил, как показано ниже.

После загрузки файла при перенаправлении на same page или some other page in your project этой проблемы можно избежать.

Например:

В моем ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="WebApplication.WebForm" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>

<body>
    <form id="form1" runat="server">
        <div>
            <asp:FileUpload ID="FileUpload1" runat="server" />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </div>
    </form>
</body>
</html>

Даже у меня возникла та же проблема, которую я решил, как показано ниже.

После загрузки файла, если вы перенаправляете на ту же или другую страницу вашего проекта. После перенаправления ответа после перенаправления не будет.

В моем ASPX

В моем коде позади

public partial class WebForm : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string path = Server.MapPath("~");
            path = path + FileUpload1.FileName;
            FileUpload1.SaveAs(path);
            Response.Redirect("WebForm.aspx"); // Responce will be cleared. This Redirection will do the Trick 
            //Put the debugger and check it will work
        }
    }

Здесь, чтобы показать сообщения об успехе и ошибках, попробуйте использовать сеансы.

person RajeshKdev    schedule 27.05.2013