У меня есть приложение, в котором я добавляю новую запись, и запись добавляется два раза, если я нажимаю кнопку обновления.
Я очищаю кеш, но у меня такая же проблема. что делать?
У меня есть приложение, в котором я добавляю новую запись, и запись добавляется два раза, если я нажимаю кнопку обновления.
Я очищаю кеш, но у меня такая же проблема. что делать?
После того, как вы обработали сообщение на странице, наилучшей практикой является переадресация, так что вы не сможете опубликовать данные во второй раз с помощью кнопки "Обновить". Это является общим для всех веб-разработчиков, а не только для ASP.NET.
Мой метод бесстыдно украден со страницы 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;
}
В идеальном сценарии HTTP POST submit, который вызывает обновление базы данных после успешного обновления на вторичную страницу, информирует пользователя об успешности операции. Если пользователь попытается вернуться на предыдущую страницу, браузер предложит пользователю сообщение, подобное ". Страница не может быть обновлена без повторной отправки информации. Нажмите" Повторить попытку "для повторной отправки информации или нажмите" Отмена ", чтобы продолжить". Этого должно быть достаточно, поскольку пользовательский ввод, который обновляет страницу, приведет к дублированию отправки. Однако если обновление не удалось, одна и та же страница загрузится и позволит пользователю повторить попытку.
Конечно, это не сложное и быстрое правило, а реализация различна. Я бы очень рекомендовал принять рекомендацию @edg на практике. Ваш код вставки базы данных должен всегда проверять дублирование перед применением вставки/обновления.
Если у вас нет сеанса (и разрешены файлы 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;
}
Если приложение принадлежит вам, вам нужно добавить код, который сначала проверяет, что запись не существует, прежде чем пытаться сохранить ее в вашей базе данных.
Проблема связана с скрытым значением, которое находится в __EVENTTARGET, которое невозможно установить с помощью кода.
Если вы можете использовать Ajax для добавления своих данных, эта проблема может быть решена.
Даже если мы используем Ajax для всей формы, он дает такую же дублируемую вставку, но мы можем попытаться очистить скрытое поле _EventTaret и изменить фокус другого элемента управления:)
Как сказал вышедший Дэвид М, лучшая идея - перенаправить после публикации. Аффект наличия другого сервера в оба конца довольно минимален, поскольку в перенаправление отправляются только заголовки http.
Если вы нуждаетесь, чтобы оставаться на той же странице, я рекомендую вам перенаправить пользователя на страницу подтверждения, где вы можете попросить пользователя, хотят ли они вставить другую запись, если тогда вы перенаправлять их обратно на страницу, где они могут вставлять записи, это поможет предотвратить дублирование вставок. Или они могут просто перейти на "главную" страницу, если они сделаны, вставляя записи. Это то, что я сделал в прошлом, когда мне нужны были пользователи, чтобы "оставаться" на одной странице после вставки.
После выполнения инструкции вставки или обновления вы можете перенаправить пользователя на ту же страницу с помощью
Response.Redirect(Request.Url.AbsoluteUri);