Есть несколько способов сделать это.Важный вопрос: какова ваша спецификация работы?
Если вы разрабатываете общедоступный веб-сайт, такой как stackoverflow, facebook и т. Д., Вам следует рассмотреть возможность реализации проверки как на стороне клиента, так и на стороне сервера.Если вы разрабатываете веб-приложение на основе интрасети, проверки на стороне клиента будет достаточно.
Если ваша форма является простой формой обратной связи, вы должны использовать Google ReCaptcha для предотвращения автоматических кодов, роботов, для предотвращения взрыва вашей базы данных или электронной почты.
https://www.google.com/recaptcha/intro/v3beta.html
Вот как я могу добиться того, чтобы пользователи не отправляли несколько сообщений.
[HttpPost]
public ActionResult Index(YourViewModel model)
{
#region backend validation
if (
!GoogleReCAPTCHAHelper.Check(Request["g-recaptcha-response"],
ConfigurationManager.AppSettings["GoogleReCAPTCHASecret"]))
{
ModelState.AddModelError(string.Empty, "You have to confirm that you are not robot!");
return View(model);
}
if ((from file in model.Files where file != null select file.FileName.Split('.')).Any(arr => arr[arr.Length - 1].ToLower() != "pdf"))
{
ModelState.AddModelError(string.Empty, "We only accept PDF files!");
return View(model);
}
if (model.Files.Count() > 2)
{
ModelState.AddModelError(string.Empty,
"You have exceeded maximum file upload size. You can upload maximum 2 PDF file!");
return View(model);
}
//// this stops the applicant sending the application multiple times within 5 minutes of a submition
DateTime? lastSubmission = null;
if (Request.Cookies["LastSubmission"] != null)
lastSubmission = Convert.ToDateTime(Request.Cookies["LastSubmission"].Value);
if (lastSubmission.HasValue && DateTime.Now < lastSubmission.Value.AddMinutes(5))
{
ModelState.AddModelError(string.Empty,
"ERROR: Your application has not been sent. This is due to receiving an application from you within the last five minutes. If you have made an error and wish to resend your application, please wait five minutes and then complete the application again.");
return View(model);
}
if (!ModelState.IsValid)
{
ModelState.AddModelError(string.Empty, "Something went wrong!");
return View(model);
}
#endregion
}
PS: model.Files - IEnumerable<HttpPostedFileBase>
Последнее, но не менее важное, когда пользователь нажимает кнопку отправки, выдолжен показывать какой-то экран загрузки или отключить кнопку для повторной отправки.Таким образом, пользователь может понять, что происходит на веб-сайте ...
А вот пример JavaScript для проверки.
function sendForm() {
if (grecaptcha.getResponse() === "") {
event.preventDefault();
$("#robotErrorDiv").slideDown();
return false;
} else {
$("#robotErrorDiv").slideUp();
}
$("#myForm").validate();
if ($("#myForm").valid()) {
$("#loaderGif").fadeIn();
$("#submitButton").text("Sending...").attr("disabled", "disabled");
$("#myForm").submit();
}
return true;
}