Как предотвратить повторные постбэки, чтобы запутать мой бизнес-уровень - PullRequest
6 голосов
/ 27 января 2009

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

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

Ответы [ 7 ]

2 голосов
/ 27 января 2009

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

  1. Отключить кнопки отправки после нажатия / нажатия;
  2. Используйте POST + REDIRECT + GET , чтобы избежать проблем с кнопкой возврата; и
  3. Замените историю в браузере , чтобы вы не могли вернуться назад (но это следует использовать с осторожностью и по уважительной причине).
1 голос
/ 27 января 2009

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

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

  • Oisin
0 голосов
/ 27 мая 2013

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

После загрузки файла Если вы перенаправите на 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
        }
    }

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

0 голосов
/ 09 мая 2012

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

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

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

0 голосов
/ 23 июля 2009

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

MyButton.Attributes.Add("onclick",
    "javascript:this.onclick=function(){return false;};");
0 голосов
/ 07 апреля 2009

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

0 голосов
/ 27 января 2009
  1. Do отключить кнопку отправки после нажатия. Это предотвратит случайный двойной щелчок или больше
  2. Я обычно перенаправляю на другой URL после обратной передачи , чтобы избежать случайного / преднамеренного обновления страницы.
  3. Наконец, в методе вставки вашей БД, проверяет наличие идентичных данных, вставленных за определенный промежуток времени (вероятно, в секундах) перед выполнением вставки. Если дублирующие данные обнаруживаются вставленными в течение нескольких секунд (или минут. Независимо от того, что имеет наибольшее значение в вашей ситуации), отобразите предупреждающее сообщение и попросите пользователя снова отправить, если пользователь считает, что это не ошибка. (Этот метод наиболее целесообразен, когда у вас есть учетная запись пользователя, и пользователь отправляет данные при входе в систему, поэтому проверка дубликатов данных выполняется для пользователя.)
...