none
lien d'activation dans un email RRS feed

  • Question

  • Bonjour,

    Lors de la création d'un compte utilisateur sur mon site, avec asp.net mvc framework et c#, comment faire pour que je puisse envoyer une demande de confirmation pour activer le compte sous forme d'un lien dans un mail sachant que je suis arrivée à envoyer un mail et mon problème est dans le lien de validation de compte et je veux que lorsque je clique sur ce lien, la date du système sera enregistré dans ma base de donné (j'ai déjà un attribut : date_validationEmail)


    • Type modifié Aurel Bera vendredi 21 septembre 2012 12:04 Pas de reponse
    • Type modifié marwa58 samedi 22 septembre 2012 13:19
    • Modifié marwa58 dimanche 23 septembre 2012 16:27
    lundi 13 août 2012 06:59

Réponses

  • Pour la vérification de l’existence de l'utilisateur ça serait plutôt:

    D'apères votre code cette méthode est dans le model User.cs

                public static bool UserExists(int _id)
                {
                    bool userExists = false;
                    string _sql = string.Format("Select * From [User] Where id='{0}'", _id);
                    SqlCommand cmd = new SqlCommand(_sql, conn);
                    conn.Open();
    
                    SqlDataReader dr = cmd.ExecuteReader();
                    if(dr.HasRows)
                        userExists = true;
                    conn.Close();
                    return userExists;
                }

    Pour l'activation cette action est dans HomeController.cs:

    public ActionResult Activate(int id)
    {
        if (MvcApp.Models.User.UserExists(id))
        {    
            // vous récupérez l'utilisateur grâce à son id et vous mettez sa propriété ConfE à true
        }
        return View();
    }

    Après il faudra penser à optimiser si l'utilisateur va encore sur le lien d'activation on lui affiche un message du type "Votre compte a déjà été activé"


    Blog: marouene.slimi.net


    • Modifié Marouene Slimi dimanche 23 septembre 2012 17:33
    • Marqué comme réponse marwa58 dimanche 23 septembre 2012 19:21
    dimanche 23 septembre 2012 17:32
  • public ActionResult Activate(int id)
    {
        if (MvcApp.Models.User.UserExists(id))
        {
             string _sql = string.Format("UPDATE [User] SET ConfE = true WHERE id ='{0}'", _id);
             SqlCommand cmd = new SqlCommand(_sql, conn);
             conn.Open();
             int nbRows = cmd.ExecuteNonQuery();
             conn.Close();
        }
        return View();
    }
    C'est ce que vous cherchez à faire ?



    Blog: marouene.slimi.net



    • Modifié Marouene Slimi dimanche 23 septembre 2012 18:36
    • Marqué comme réponse marwa58 dimanche 23 septembre 2012 19:20
    dimanche 23 septembre 2012 18:32

Toutes les réponses

  • Bonjour,

    Dans ce cas, dans le Page_Load() de la page d'activation du compte, il suffit d'exécuter une requête SQL de type UPDATE afin de modifier la ligne correspondant au compte à activer. Vous pouvez récupérer la date système via la propriété DateTime.Today : http://msdn.microsoft.com/fr-fr/library/system.datetime.today.aspx

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mercredi 15 août 2012 09:32
    Modérateur
  • Bonjour,

    J'ai mis dans la partie controller ce code : 

        SendEmail(pers.AdresseEmail, "nooora12@gmail.com", "hiii", "Bonjour M/Mlle/Mme " +pers.Nom + "   " + pers.Prenom +  " \n \nVous venez de vous inscrire sur la plate-forme de paiement MP2012 avec le login " + pers.NumTel +
                    "\n \n Message envoyé depuis le serveur MP2012, cliquer sur http://localhost:34470/Home/LogIn pour activer votre compte \n \n Votre mot de passe est : " + pers.CodePin);
            
    Comment faire pour que lorsque le lien d'activation est cliqué dessus, la date du système est directement enregistré dans ma base
    mercredi 15 août 2012 13:39
  • Bonjour,

    Il suffit de générer le lien suivant : http://localhost:34470/Home/Activate?login=xxxxxxx

    Dans le contrôleur "HomeController", vous devez ajouter l'action suivante :

        Public Function Activate(login As String) As ActionResult
    
            ' Requête UPDATE pour mettre à jour la date d'activation du compte
     
        End Function

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mercredi 15 août 2012 17:13
    Modérateur
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 14 septembre 2012 06:07
  • Bonjour,

    Si j'écrit la fonction à part puis je fait un appel c'est faisable ?

    Si non, j'ai écrit cette méthode mais je doute qu'elle soit correcte !!

        public static bool Activate(DateConfE) 
             {
                 bool ConfEmail = false;
    
                 string _sql1 = string.Format("Update User set ConfEmail=true , DateConfE=");
                
                 SqlCommand cmd = new SqlCommand(_sql1, conn);
                 conn.Open();
    
                 SqlDataReader dr = cmd.ExecuteReader();
                ConfEmail = dr.HasRows;
                 conn.Close();
    
    
                 return (ConfEmail);
             }
    

    mardi 18 septembre 2012 11:18
  • Bonjour

    La requête SQL UPDATE doit avoir une condition (sinon vous allez modifier tous les lignes dans la table « User »).

    Donc si vous voulez modifier pour un seul enregistrement (pour un seul utilisateur) vous allez avoir :

       string _sql1 = string.Format("Update User set ConfEmail=true , DateConfE='{0}' Where Utilisateur='{1}'", DateConfE, Utilisateur);

    Aussi, vous devez devinir/ouvrir la connexion SQL (variable conn)  avant d’exécuter  la requête, et la fermer après ExecuteNonQuery:

    SqlConnection conn = new SqlConnection (….)
    conn.Open() ;
    ………………………………..
    conn.Close () ;

    Cordialement,



    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.



    • Modifié Aurel Bera mardi 18 septembre 2012 14:12
    mardi 18 septembre 2012 14:11
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 19 septembre 2012 12:03
  • Bonjour,

    Nous changeons le type de votre question à « Discussion générale » parce que vous n’êtes pas revenu avec les informations sollicitées. Si vous avez plus de temps pour réexaminer la question et fournir plus d'informations, n'hésitez pas à modifier le type du thread à « Question ». Si le problème est résolu, s’il vous plaît partagez la solution avec nous afin que la réponse puisse être trouvée et utilisée par d'autres membres de la communauté ayant des questions similaires. Merci !

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 21 septembre 2012 12:03
  • Bonjour,

    L'action que je veut faire c'est une modification d'un attribut dans la table de ma base de données, Je veux que cette modification est exécuté lors d'un clique par l'utilisateur sur le lien envoyé dans la boite email

    samedi 22 septembre 2012 13:21
  • Bonjour,

    Il va être difficile de vous aider si vous reposer votre question sans aucune réaction aux suggestions qui vous sont faites. Que donne l'instruction SQL qui vous a été donnée précédemment ? Avez-vous commencé qq chose ? Si oui, quel est le premier point qui vous bloque ?

    Le problème est-il de mettre à jour la base de données ? Ou êtres vous déjà bloqué avant cela et par quoi ? Le principe serait de créer une page qui va juste :
    - récupérer un paramètre permettant d'identifier l'utilisateur
    - exécuter l'instruction SQL qui permet de modifier l'attribut que vous voulez dans la base pour cet utilisateur


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    samedi 22 septembre 2012 13:40
    Modérateur
  • Comment je traduit le clique sur un lien que j'ai déjà réussi à l'envoyé à une adresse email? C'est à dire la modification est faite suite à un clique

    J'écrit quoi dans ma fonction dans la partie controller ?

    samedi 22 septembre 2012 13:57
  • Le mail va contenir un lien par exemple de la forme http://monserveur/account/activate/Test

    Vous devez avoir dans votre application MVC une "route" qui indique que l'url va être sous la forme contrôleur/action/id

    Côté MVC on voit donc une action Activate dans le contrôleur Account et le paramètre id va être récupéré automatiquement. Donc essayez :

           public ActionResult Activate(string id)
            {
                return View();
            }

     Mettez un point d'arrêt sur return View et donc vous devriez voir que le paramètre id de cette action a été automatiquement alimenté avec la valeur "Test". Bien sûr vous pouvez utiliser ce paramètre pour mettre à jour la base comme cela vous a été indiqué précédemment...

    Si vous venez de WebForms ou Windows, le problème est peut-être que vous raisonnez encore en "évènementiel" ("suite à un clic") alors que le point de vue de MVC est que l'URL en-elle même indique l'opération à réaliser.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    samedi 22 septembre 2012 15:21
    Modérateur
  • Bonjour,

    Pouvez_vous mieux expliquer comment je dois avoir dans mon application MVC une "route" qui indique que l'url va être sous la forme contrôleur/action/id ?

    samedi 22 septembre 2012 15:47
  • C'est le code montré là : http://msdn.microsoft.com/fr-fr/library/cc668201(v=vs.100).aspx#adding_routes_to_an_mvc_application

    Mais normalement vous devriez déjà avoir ce code dans le modèle Visual Studio. Vous créez bien votre appli MVC avec Visual Studio ? Vous devriez donc trouver cette ligne dans le fichier global.asax.cs

    Par exemple si je crée une appli avec Visual Web Developer 2010 Express, le modèle que je choisis incorpore déjà le code suivant dans global.asax.cs :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace MvcApplication1
    {
        // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
        // visit http://go.microsoft.com/?LinkId=9394801
    
        public class MvcApplication : System.Web.HttpApplication
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new HandleErrorAttribute());
            }
    
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    "Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
                );
    
            }
    
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
    
                RegisterGlobalFilters(GlobalFilters.Filters);
                RegisterRoutes(RouteTable.Routes);
            }
        }
    }


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    samedi 22 septembre 2012 16:44
    Modérateur
  • Et oui j'ai trouvé ce code : (j'utilise Visual studio 2010)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace MvcApp
    {
        // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
        // visit http://go.microsoft.com/?LinkId=9394801
    
        public class MvcApplication : System.Web.HttpApplication
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    "Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                   new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
                    //new { controller = "Account", action = "Register", id = UrlParameter.Optional } // Parameter defaults
                );
    
            }
    
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
    
                RegisterRoutes(RouteTable.Routes);
            }
        }
    }

    Et comment ce code doit indiquer que l'url va être sous la forme contrôleur/action/id

    samedi 22 septembre 2012 17:20
  • Il s'agit de l'appel de MapRoute.

    Le paramètre "{controller}/{action}/{id}" fait que pour une url comme /account/activate/test, ASP.NET va donc isoler : controller=account donc appellera la classe AccountController, action=activate donc on appelera la méthode Activate, et id=test donc si cette méthode a un paramètre id, il sera alimenté avec la valeur "test".

    Votre code fonctionne ou pas ? C'est déjà fait donc si vous avez le contrôleur correct cela devrait fonctionner. Si ce n'est pas le cas, indiquer le message d'erreur ce qui permettra de voir plus facilement ce qui coince. Si cela fonctionne, je vous suggère de poursuivre en étudiant des tutoriels comme http://dotnet.developpez.com/mvc/ qui semblent être une traduction non officielle de ceux fournis en anglais par Microsoft...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    samedi 22 septembre 2012 19:14
    Modérateur
  • La partie "route" sera comme celle là? 

        public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    "Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                 
                  new { controller = "Home", action = "Activate", id = UrlParameter.Optional }  
                 
                );
    
            }

    et je met quoi dans le controlleur ? Ce code est correcte? :

        public ActionResult Activate(string id)
            {
               
                logger.Info("User is being verified with this ID:" + id);
                Guid guid = new Guid(id);
                MembershipUser user = Membership.GetUser(guid);
                if (user != null && user.IsApproved == false)
                {
                    user.IsApproved = true;
                    Membership.UpdateUser(user);
                    FormsAuthentication.SetAuthCookie(user.UserName, false);
                }
    
                return View();
            }
    

    dimanche 23 septembre 2012 12:24
  • Bonjour,

    Il ne faut pas toucher la méthode MapRoute.

    Avec ça:

    new { controller = "Home", action = "Activate", id = UrlParameter.Optional }  

    vous risquez d'avoir des soucis d'affichage et vous aurez la page d'activation qui s'affichera en page d'accueil car cet objet représente les routes par défaut. donc il faut remettre les valeurs comme elles étaient avant c’est à dire comme suit:

    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 

    D'abord il faut que le lien qui est dans le mail, ait la forme suivante:

    Prenons l'exemple où id = 12345 le lien du mail doit ressembler à ça:

    http://monserveur/account/activate/12345

    Assurez vous que votre SendEmail contienne bien le lien voulu.

    Puis dans votre contrôleur Account ajoutez une action Activate comme suit:

    public ActionResult Activate(int id) { // Vérification de l’existence de l'id 12345 par exemple // Si oui: DateTime dateNow = DateTime.Now; // récupération de la date courante // modification la colonne DateConfE de l'enregistrement id = 12345 return View(); }

    C'est tout ce qu'il y a à faire. Il n'est pas nécessaire de changer les routes.

    Cordialement,


    Blog: marouene.slimi.net



    dimanche 23 septembre 2012 13:51
  • Et je change ce code ?

    public ActionResult Create(MvcApp.Models.User pers, string captcha)
            {  
    
                if (captcha == HttpContext.Session["captcha"].ToString())
               
                {
                   
                    
                    pers.CodePin = GeneratePassword().ToString();
                    pers.ConfEmail = false;
                    pers.ConfSms = false;
                    pers.Actif = false;
                pers.DateAdh = DateTime.Now;
                _Context.User.AddObject(pers);
                _Context.SaveChanges();
                
    
             
                SendEmail(pers.AdresseEmail, "mirette002@gmail.com", "hiii", "Bonjour M/Mlle/Mme " +pers.Nom + "   " + pers.Prenom +  " \n \nVous venez de vous inscrire sur la plate-forme de paiement MP2012 avec le login " + pers.NumTel +
                    "\n \n Message envoyé depuis le serveur MP2012, cliquer sur http://localhost:34470/Home/Activate/id= "+pers.IdUser.ToString()+ " pour activer votre compte \n \n Votre mot de passe est : " + pers.CodePin);
    
                
             
               return RedirectToAction("Confirm");
            }
    
                else
                    ViewData["Message"] = "CAPTCHA challenge failed - please try again!";
    
    
               return View();
               
    
            }

    dimanche 23 septembre 2012 15:40
  • Vous n'avez pas besoin de d'écrire id= étant donné que le pattern de la route est {controller}/{action}/{id}

    donc le lien peut s'écrire ainsi:

    http://localhost:34470/Home/Activate/"+pers.IdUser.ToString()

    Vous avez mis votre action Activate dans le controller Home ou dans le controleur Account ?

    Pouvez vous me montrer le code de l'action Activate


    Blog: marouene.slimi.net

    dimanche 23 septembre 2012 15:40
  •   public static bool ActivateEmail(int _id, bool _ConfE)
            {
                bool activateE = false;
    
                string _sql = string.Format("Select * From [User] Where id='{0}' And ConfEmail ='{1}'", _id, _ConfE);
                SqlCommand cmd = new SqlCommand(_sql, conn);
                conn.Open();
    
                SqlDataReader dr = cmd.ExecuteReader();
                activateE = dr.HasRows;
                conn.Close();
                return (activateE);
            }

        public ActionResult Activate(int id, MvcApp.Models.User pers)
            {
          
                if (MvcApp.Models.User.ActivateEmail(pers.id, pers.ConfEmail))
                {
                    pers.DateConfE = DateTime.Now; // récupération de la date courante
                    pers.ConfEmail = true;
    
                    return View();
    
                }
    
    
            }
    

    J'ai mis l'action Activate dans le controller Home 

    dimanche 23 septembre 2012 16:18
  • Peut-être mais Activate est bien sûr juste un exemple. Vous pouvez bien sûr appeler votre contrôleur et votre vue comme bon vous semble à partir du moment ou vous allez ensuite sur votre site sur :

    /UnDesControleursQueVousAvezCréés/UneActionDeCeControleur/ParamètreId

    Je pensais que vous cherchiez à comprendre comment fonctionne MVC mais j'ai l'impression que vous avez en fait toujours un problème.

    Encore une fois, il sera beaucoup plus facile de vous aider si vous nous expliquez quel est le problème que vous rencontrez !?

    Je vois aussi dans votre réponse à Marouene que vous changez soudain de code avec d'autres paramètres et que vous n'avez toujours pas dit une seule fois si le code qui vous a été fourni ou le code que vous montre fonctionne.

    Il sera plus facile de vous aider si :

    - vous évitez de changer de code d'un message à l'autre sans préavis
    - si vous décrivez le résultat que vous obtenez (message d'erreur) au lieu de nous montrer du code sans même que nous sachions le résultat que vous obtenez chez vous (il fonctionne ou pas en fonction par exemple de l'url que vous taperez dans votre navigateur ou selon les autres fichiers présents dans votre solution, donc il est quasi-impossible de dire si le code est correct, il faut partir de ce que vous voyez chez vous)

    Si cela n'a jamais marché,  je suggère de revenir au code que j'ai posté et donc de dire quel est le message d'erreur que vous obtenez.

    Une fois que c'est ok essayez de le modifier (pas trop à la fois) et indiquer le problème que vous avez...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    dimanche 23 septembre 2012 16:42
    Modérateur
  • Dites nous plutôt ce qui se passe actuellement quand vous exécutez ce code ?

    A priori ce n'est plus le lien pour la confirmation de l'enregistrement ? Vous êtes passé à une autre partie qui est celle qui génère le message ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    dimanche 23 septembre 2012 16:44
    Modérateur
  • l'entête est plutôt sous cette forme:

    public ActionResult Activate(int id)
    

    Ce que je remarque c'est que vous avez exposez plusieurs manières pour faire l'activation.

    quel code vous avez finalement écrit pour la création et l'activation du compte?

    J'ai l'impression qu'à un certain moment vous utilisez Entity Framework et dans d'autres vous utilisez Directement des commandes SQL.

    Le mieux c'est de nous dire quelles sont les technologies que vous utilisez. L'environnement technique.

    Entity Framework , SQL ...

    Vous utilisez quel Membership celui par défeaut ?

    L'id de votre table User c'est un int ou un guid ? (j'ai vu que dans le code vous avez parfois int parfois guid)

    Merci d'être précise au niveau des détails techniques et de nous fournir les erreurs qui s'affichent lorsque vous compilez votre solution et qu'est ce que vous n'arrivez pas à faire exactement.

    Cordialement


    Blog: marouene.slimi.net

    dimanche 23 septembre 2012 16:50
  • Ce code que j'ai essayé retourne une erreur..

    Mais mon problème, encore une fois, c'est que:

    lorsque je clique sur un bouton "valider" au dessous d'un formulaire d'inscription, un utilisateur est créer et un email est envoyé vers la boite mail de l'utilisateur qui veut créer un compte et lorsque cet utilisateur clique sur ce lien, un attribut "ConfE" de la table "User" prendra  "true"

    Donc je doit écrire quoi dans la partie controller ? et est_ce que je doit ajouter ce code dans la partie ou se fait l'envoie du mail et l'enregistrement des données dans la base de données?

    dimanche 23 septembre 2012 17:00
  • @Marouene:

    Je vous ai montré le code que j'ai saisie finalement..
    Membership est dans le controller "account" et je l'ai pas touché
    L'id de a table c'est int et j'utilise parfois int et parfois guid pour essayer et savoir avec laquelle je travaille le mieux.

    dimanche 23 septembre 2012 17:10
  • Pour la vérification de l’existence de l'utilisateur ça serait plutôt:

    D'apères votre code cette méthode est dans le model User.cs

                public static bool UserExists(int _id)
                {
                    bool userExists = false;
                    string _sql = string.Format("Select * From [User] Where id='{0}'", _id);
                    SqlCommand cmd = new SqlCommand(_sql, conn);
                    conn.Open();
    
                    SqlDataReader dr = cmd.ExecuteReader();
                    if(dr.HasRows)
                        userExists = true;
                    conn.Close();
                    return userExists;
                }

    Pour l'activation cette action est dans HomeController.cs:

    public ActionResult Activate(int id)
    {
        if (MvcApp.Models.User.UserExists(id))
        {    
            // vous récupérez l'utilisateur grâce à son id et vous mettez sa propriété ConfE à true
        }
        return View();
    }

    Après il faudra penser à optimiser si l'utilisateur va encore sur le lien d'activation on lui affiche un message du type "Votre compte a déjà été activé"


    Blog: marouene.slimi.net


    • Modifié Marouene Slimi dimanche 23 septembre 2012 17:33
    • Marqué comme réponse marwa58 dimanche 23 septembre 2012 19:21
    dimanche 23 septembre 2012 17:32
  • J'ai déjà créer une fonction "UserIsValid" pour l'utiliser dans HomeController.cs ( ActionResult LogIn)
     static SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["mvcConnection"].ToString());
    
    
            public static bool UserIsValid(int _NumTel, string _CodePin)
            {
                bool authenticated = false;
    
                string _sql = string.Format("Select * From [User] Where NumTel='{0}' And CodePin ='{1}'", _NumTel, _CodePin);
                SqlCommand cmd = new SqlCommand(_sql, conn);
                conn.Open();
    
                SqlDataReader dr = cmd.ExecuteReader();
                authenticated = dr.HasRows;
                conn.Close();
                return (authenticated);
            }
    public ActionResult LogIn(MvcApp.Models.User model)
            {
                if (ModelState.IsValid)
                {
                  
                    if (MvcApp.Models.User.UserIsValid(model.NumTel,model.CodePin))
                    {
    
                      
                        return RedirectToAction("Index", "Home");
    
                    }
                    else
                    {
                        ModelState.AddModelError("", "The user name or password provided is incorrect.");
                    }
                }
    
    
                return View(model);
            }
    
    Alors que "UserExists" dépend d'une seule variable


    • Proposé comme réponse Marouene Slimi dimanche 23 septembre 2012 17:56
    • Non proposé comme réponse Marouene Slimi dimanche 23 septembre 2012 17:56
    dimanche 23 septembre 2012 17:52
  • Votre but est de valider un User grâce au lien http://monserveur/account/activate/12345

    12345 étant l'id du user donc vous ne disposez que de l'id du user pour vérifier s'il existe vraiment dans la base ou non. S'il existe, vous le récupérez dans la l'action Activate et vous lui modifiez la valeur de sa propriété ConfE à true


    Blog: marouene.slimi.net

    dimanche 23 septembre 2012 17:59
  • Non, vous ne voulez probablement pas mettre ConfE à true au moment de l'envoi du mail sinon à quoi servirait ce mail de confirmation ?

    La succession des opérations est que vous écrivez les données de base de l'utilisateur et envoyez le mail et c'est seulement quand l'utilisateur va cliquer sur le lien dans le mail (peut-être plusieurs heures ou jours après pourquoi pas) que cela va donc appeler une autre page sur le serveur qui fera elle la mise à jour de la base et modifiera ConfE pour indiquer que l'inscription est confirmée.

    Donc on a bien deux étapes différentes.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    dimanche 23 septembre 2012 18:02
    Modérateur
  • Non, vous ne voulez probablement pas mettre ConfE à true au moment de l'envoi du mail sinon à quoi servirait ce mail de confirmation ?

    La succession des opérations est que vous écrivez les données de base de l'utilisateur et envoyez le mail et c'est seulement quand l'utilisateur va cliquer sur le lien dans le mail (peut-être plusieurs heures ou jours après pourquoi pas) que cela va donc appeler une autre page sur le serveur qui fera elle la mise à jour de la base et modifiera ConfE pour indiquer que l'inscription est confirmée.

    Donc on a bien deux étapes différentes.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    Tout à fait d'accord avez vous Patrice.


    Blog: marouene.slimi.net

    dimanche 23 septembre 2012 18:10
  • Oui c'est exactement ce que je voulais faire !
    dimanche 23 septembre 2012 18:25
  • public ActionResult Activate(int id)
    {
        if (MvcApp.Models.User.UserExists(id))
        {
             string _sql = string.Format("UPDATE [User] SET ConfE = true WHERE id ='{0}'", _id);
             SqlCommand cmd = new SqlCommand(_sql, conn);
             conn.Open();
             int nbRows = cmd.ExecuteNonQuery();
             conn.Close();
        }
        return View();
    }
    C'est ce que vous cherchez à faire ?



    Blog: marouene.slimi.net



    • Modifié Marouene Slimi dimanche 23 septembre 2012 18:36
    • Marqué comme réponse marwa58 dimanche 23 septembre 2012 19:20
    dimanche 23 septembre 2012 18:32
  • Euh et donc vous en êtes où ? Vous continuez à ne donner aucune info sur votre situation dans chacune de vos réponses ;-) ! Comme je disais :

    - pour l'instant je ne sais pas du tout où vous as conduit cette discussion (ne serait ce que de savoir si vous arrivez à avoir une vue et récupérer les paramètres même sans rien en faire pour l'instant, le problème de base semblant être de commencer avec MVC)

    Comme je disais au début, n'essayez pas de tout faire en même temps. Résolvez les problèmes l'un après l'autre et surtout dites à chaque fois le résultat que vous obtenez sinon on essaie de vous aider sans aucune information sur votre situation actuelle ce qui fait consommer plus de temps que nécessaire à tout le monde.

    Donc si vous avez encore besoin d'aide :

    - choisissez un premier objectif (même simplifié, cela peut-être juste la mécanique d'affichage des vues, d'appel des contrôleurs, de passage des paramètres pour déjà vérifier que la partie MVC est au point avant de remplir les contrôleurs avec le code spécifique à votre application, "envoi de mail" et dans un autre contrôleur "modification de la base" ce qui pourra être fait ultérieurement si votre structure de base est correctement en place) et allez jusqu'au bout de sa résolution sans changer en cours de route avant de passer à l'étape suivante.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    dimanche 23 septembre 2012 19:01
    Modérateur