Когда браузеру сообщают об обновлении, он повторно отправляет последний отправленный запрос. Если последним отправленным запросом была отправка формы, то форма будет повторно отправлена. Обойти это невозможно, потому что просто так работает модель.
Чтобы предотвратить нежелательные эффекты, вам необходимо:
- используйте post-redirect-get, чтобы последним запросом (повторным отправленным) был тот, который считывает результаты отправки вашей формы, а не саму форму.
или
- поместите идентификатор в форму, чтобы повторная отправка могла быть проигнорирована сервером (хотя пользователь все равно увидит подтверждение «Вы хотите повторно отправить?»)
Мне не известны какие-либо другие варианты, и, учитывая то, как работает «обновление», я действительно не вижу, как могут быть другие. Из этих двух вариантов post-redirect-get обеспечивает максимально чистое взаимодействие с пользователем и является наиболее теоретически «чистым» использованием глаголов HTTP, поэтому обычно оно является предпочтительным и, IMO, правильным решением.