Обновление страницы вызывает дублирование POST в приложениях ASP.NET - PullRequest
12 голосов
/ 13 апреля 2009

У меня есть приложение, в котором я добавляю новую запись, и запись добавляется два раза, если я нажимаю кнопку обновления.

Я очищаю кеш, но у меня та же проблема. что делать?

Ответы [ 10 ]

10 голосов
/ 13 апреля 2009

После того, как вы обработали сообщение обратно на страницу, рекомендуется перенаправить его так, чтобы вы не могли публиковать данные во второй раз, используя кнопку «Обновить». Это общее для всех веб-разработок, а не только для ASP.NET.

7 голосов
/ 04 сентября 2009

Мой метод бессовестно похищен со страницы 4 этой потрясающей статьи об ASP Alliance. Чтобы обнаружить обновление, вы можете сохранить одно и то же значение в ViewState и Session. Если пользователь обновляет страницу, он отправляет PostBack, используя старые данные ViewState, которые не соответствуют вашему значению Session. Как только вы обнаружите это, вы можете создать страницу, от которой наследуются все ваши другие страницы, с помощью простой переменной, чтобы проверить, обновил ли пользователь браузер. Это решение требует, чтобы ViewState был включен и действительный сеанс.

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    if (IsPostBack && ViewState[REFRESH_CHECK_GUID] != Session[REFRESH_CHECK_GUID])
    {
        IsRefresh = true;
    }
    Session[REFRESH_CHECK_GUID] = System.Guid.NewGuid().ToString();
    ViewState[REFRESH_CHECK_GUID] = Session[REFRESH_CHECK_GUID];
}

/// <summary>
/// True if the last PostBack was caused by a Page refresh.
/// </summary>
public virtual bool IsRefresh
{
    get;
    private set;
}
3 голосов
/ 13 апреля 2009

В идеальном случае отправка HTTP POST, которая вызывает обновление базы данных, будет перенаправлена ​​после успешного обновления на дополнительную страницу, которая информирует пользователя об успешном выполнении операции. Если пользователь попытается вернуться на предыдущую страницу, браузер запросит у пользователя сообщение, подобное «». Невозможно обновить страницу без повторной отправки информации. Нажмите «Повторить», чтобы повторно отправить информацию, или «Отмена, чтобы продолжить». Этого должно быть достаточно, чтобы указать пользователю, что обновление страницы повлечет за собой повторную отправку. Однако, если обновление завершится неудачно, эта же страница загрузится и позволит пользователю повторить попытку. 1001 *

Конечно, это не жесткое и быстрое правило, и реализации могут отличаться. Я настоятельно рекомендую принять предложение @ edg на практике - код вставки вашей базы данных должен всегда проверять дублирование перед применением вставки / обновления.

2 голосов
/ 24 сентября 2009

Если у вас нет сеанса (и включены файлы cookie), вы можете использовать:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    if (IsPostBack && ViewState[REFRESH_CHECK_GUID] != Request.Cookies[REFRESH_CHECK_GUID])
    {
        IsRefresh = true;
    }
    String checkGuid=System.Guid.NewGuid().ToString();
    Response.Cookies[REFRESH_CHECK_GUID] = checkGuid;
    ViewState[REFRESH_CHECK_GUID] = checkGuid;
}

/// <summary>
/// True if the last PostBack was caused by a Page refresh.
/// </summary>
public virtual bool IsRefresh
{
    get;
    private set;
}
1 голос
/ 13 апреля 2009

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

0 голосов
/ 13 сентября 2016

После выполнения оператора вставки или обновления вы можете перенаправить пользователя на ту же страницу с помощью

Response.Redirect (Request.Url.AbsoluteUri);

0 голосов
/ 03 сентября 2009

Если вам нужно , чтобы остаться на той же странице, то я рекомендую перенаправить пользователя на страницу подтверждения, где вы можете спросить пользователя, хотят ли они вставить другую запись, если да, то вы перенаправите их обратно на страницу, где они могут вставить записи, это поможет предотвратить повторяющиеся вставки. Или они могут просто перейти на «главную» страницу, если они закончили вставлять записи. Это то, что я делал в прошлом, когда мне было необходимо, чтобы пользователи могли «оставаться» на той же странице после вставки.

0 голосов
/ 14 апреля 2009

Как сказал Дэвид М, лучшая идея - перенаправить после поста. Эффект от повторного обращения к другому серверу довольно минимален, так как только заголовки http отправляются в перенаправлении.

0 голосов
/ 14 апреля 2009

Даже если мы используем Ajax для всей формы, он дает одинаковую дубликат вставки, но мы можем попробовать очистить скрытое поле _EventTaret и изменить фокус другого элемента управления:)

0 голосов
/ 13 апреля 2009

Проблема связана со скрытым значением, которое находится в __EVENTTARGET, которое не может быть установлено с помощью кода.

Если вы можете использовать Ajax для добавления своих данных, эта проблема может быть решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...