POST дубликата причин обновления страницы в приложениях ASP.NET

Вы можете использовать отличные от ASCII символы. Если вы сохраните файл как UTF-8, то каждый браузер, который был обновлен в этом столетии, сможет отобразить его. Прошли десятилетия с тех пор, как браузеры подавили знак порядка следования байтов, но большинство людей рекомендуют не указывать его.

Вы также можете использовать не-ASCII символы в HTML, сохраненные как UTF-8, буквально и без каких-либо escape-кодов. Хотя браузеры должны иметь возможность определять набор символов, рекомендуется добавлять тег <meta charset="UTF-8"> или <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> сразу после тега <html>. Это устраняет всю двусмысленность.

12
задан John Saunders 13 April 2009 в 11:07
поделиться

9 ответов

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

10
ответ дан 2 December 2019 в 06:45
поделиться

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

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

3
ответ дан 2 December 2019 в 06:45
поделиться

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

1
ответ дан 2 December 2019 в 06:45
поделиться

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

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

0
ответ дан 2 December 2019 в 06:45
поделиться

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

0
ответ дан 2 December 2019 в 06:45
поделиться

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

0
ответ дан 2 December 2019 в 06:45
поделиться

Мой метод бессовестно украден со страницы 4 этой замечательной статьи об ASP Alliance. Чтобы обнаружить обновление, вы можете сохранить одно и то же значение в ViewState и Session. Если пользователь обновляет страницу, она выполняет PostBack, используя старые данные ViewState, которые не соответствуют значению сеанса. Как только вы это обнаружите, вы можете создать страницу, от которой наследуются все ваши другие страницы, с простой переменной, чтобы проверить, обновил ли пользователь браузер. Это решение требует, чтобы 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;
}
7
ответ дан 2 December 2019 в 06:45
поделиться

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

0
ответ дан 2 December 2019 в 06:45
поделиться

Если у вас нет сеанса (и включены файлы 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;
}
2
ответ дан 2 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: