Bonjour à vous,

Je cherche désespérément à construire un formulaire d’envoi d’un message par e-mail basique, accompagné d’un ( Google recaptcha ) dont voici l’ensemble du code (je précise que je n’ai rien inventé, je copie ce que je trouve sur le net), je pense que lorsque la solution sera trouvée, ça pourra servir aux autres webmasters :

Ajout d’un nouveau fichier de classe au dossier Modèles et nommé EmailFormModel.cs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
 
 
namespace Web_essai_MVC.Models
{  
    public class EmailFormModel
    {
        [Required, Display(Name = "Nom & Prénom")]
        public string FromName { get; set; }
        [Required, Display(Name = "Adresse e-mail"), EmailAddress]
        [RegularExpression(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$",
            ErrorMessage = "Adresse e-mail invalide.")]
        public string FromEmail { get; set; }
        [Required]
        public string Message { get; set; }
    }
}
La vue Contact version simplifiée:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 
@model Web_essai_MVC.Models.EmailFormModel
@{
    /**/
 
    ViewBag.Title = "Contact";
}
                                                    // j'ai peut-être un soucis avec (FormSubmit) comment le noter dans la ligne ci-dessous ?
 
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "idForm" }))
 
 
{
        @Html.AntiForgeryToken()
        <h3>Formulaire...</h3>
 
 
        <div class="form-group">
 
            @Html.LabelFor(m => m.FromName, new { @class = "col-md-6 control-label" })
 
            <div class="col-md-10">
                @Html.TextBoxFor(m => m.FromName, new { @class = "form-control" })
 
                <span style="color:red;"> @Html.ValidationMessageFor(m => m.FromName)</span>
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(m => m.FromEmail, new { @class = "col-md-6 control-label" })
            <div class="col-md-10">
                @Html.TextBoxFor(m => m.FromEmail, new { @class = "form-control" })
                <span style="color:red;"> @Html.ValidationMessageFor(m => m.FromEmail)</span>
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(m => m.Message, new { @class = "col-md-6 control-label" })
 
        </div>
        <div class="col-md-10">
            @Html.TextAreaFor(m => m.Message, new { @class = "form-control" })
            <span style="color:red;">@Html.ValidationMessageFor(m => m.Message)</span>
        </div>
        <div class="form-group">
            <div class="col-md-10">
 
                <br />
                <div>
 
 
                    <div>
 
 
                    <div class="g-recaptcha" data-sitekey="xxxxxxxxxxxxxxxxxxxxxxx"></div>
                    <span style="display:inline-block; font-size:20px;margin:20px 0;padding:20px;border:1px solid #fff">
                        @ViewBag.Message
                    </span>
                    <br />
                    <input id="btnSubmit" type="submit" class="btn btn-default" value="Envoyer" />
 
                    </div>
 
 
                    <script src='https://www.google.com/xxxx'></script>
</div>
 
                <script>
                    $("#idForm").submit(function () {
                        if ($('#idForm').valid()) {
                            $("#btnSubmit").attr("disabled", "disabled");
                            return true;
                        }
                    });
                </script>
            </div>
        </div>
}
 
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
Le fichier HomeController.cs :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net;
using System.Net.Mail;
using Web_essai_MVC.Models;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
 
namespace Web_essai_MVC.Controllers
{
    public class HomeController : Controller
    {
 
        public ActionResult Index()
        {
            return View();
        }
 
        public ActionResult Contact()
        {
 
            return View();
 
        }
 
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Contact(EmailFormModel model) 
        {
 
 
            if (ModelState.IsValid)
            {
                var body = "<p>Adresse e-mail : {0} ({1})</p><br/><p> Message :</p><br/><p>{2}</p>";
                var message = new MailMessage();
                message.To.Add(new MailAddress("Contact@xxxxxxx.fr"));
                message.Subject = "Message en provenance du site d'xxxxx...";
                message.Body = string.Format(body, model.FromName, model.FromEmail, model.Message);
                message.IsBodyHtml = true;
 
                using (var smtp = new SmtpClient())
                {
 		// les paramètres smtp sont dans le fichier  web.config
 
                    await smtp.SendMailAsync(message);
                   return RedirectToAction("SenD");
 
                }
            }
            return View(model);
 
        }
        public ActionResult SenD()
        {
            return View();
        }
 
    }
}
Tous ça fonctionne bien je reçois le mail….MAIS !
Que je valide ou pas le captcha google l’e-mail part quand même….Voici le code, car mon malheur c’est que je ne sais pas comment le traiter ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
        [HttpPost]
        public ActionResult FormSubmit()    // FormSubmit n’est pas reconnu par HomeControllers
        {
            //Validez Google recaptcha ici
            var response = Request["g-recaptcha-response"];
            string secretKey = "xxxxxxxxxxxxxxxxxx";
            var client = new WebClient();
            var result = client.DownloadString(string.Format("https://www.google.com/xxxxxxx", secretKey, response));
            var obj = JObject.Parse(result);
            var status = (bool)obj.SelectToken("success");
            ViewBag.Message = status ? "Google reCaptcha validé" : "Google reCaptcha non validé";
        }
Comment faire en sorte que mon code dans le HomeControllers, soit prit en compte avant l’envoie de l’e-mail ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
 
       public ActionResult Contact()
        {
 
            return View();
 
 
        }
 
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Contact(EmailFormModel model) 
        {
 
 
            if (ModelState.IsValid && statut) // status n’est pas reconnus
            {
 
                //Validez Google recaptcha ici
                var response = Request["g-recaptcha-response"];
                string secretKey = "xxxxxxxxxxxxxxxxxx";
                var client = new WebClient();
                var result = client.DownloadString(string.Format("https://www.google.com/xxxxxxx", secretKey, response));
                var obj = JObject.Parse(result);
                var status = (bool)obj.SelectToken("success");
                ViewBag.Message = status ? "Google reCaptcha validé" : "Google reCaptcha non validé";
 
 
 
                var body = "<p>Adresse e-mail : {0} ({1})</p><br/><p> Message :</p><br/><p>{2}</p>";
                var message = new MailMessage();
                message.To.Add(new MailAddress("message@xxxxxx.fr"));
                message.Subject = "Message en provenance du site d'xxxxx...";
                message.Body = string.Format(body, model.FromName, model.FromEmail, model.Message);
                message.IsBodyHtml = true;
 
                using (var smtp = new SmtpClient())
                {
                     // les paramètres smtp sont dans le fichier  web.config
 
                    await smtp.SendMailAsync(message);
                   return RedirectToAction("SenD");
 
                }
            }
            return View(model);
 
        }
        public ActionResult SenD()
        {
            return View();
        }
J'ai essayé de mettre le code du captcha dans le fichier (EmailFormModel.cs ) mais sans succès.

Je fini par tout mélanger.
C’est tellement plus agréable d’avoir à valider un formulaire avec ce type de captcha.
A défaut d’aide, ou puis-je trouver l’information ?

Par avance, merci à mon sauveur.

Bruno