How to block the registration of an already registered user

2

I'm developing an application that manages Courses in ASP.NET MVC, I'm still a beginner, and I'm trying to do the following: The Student has a screen where he lists all the courses for him to choose and make his enrollment in any of these courses. This part I've already done , but I need to make the following control, where, if that student signs up for a course , for example, information systems you will not be able to sign up for this same course because it is already subscribed, the system should bar you and not let it make two entries in the same course.

My Action Enrollment

    // GET
    public ActionResult Inscricao()
    {
        //Aqui eu pego o Aluno logado
        Aluno aluno = db.Alunos.FirstOrDefault(a => a.Usuario == System.Web.HttpContext.Current.User.Identity.Name);
        if (aluno == null)
            return View("MeusCursos");

        //Aqui ficaria a parte onde verifica se o aluno já está inscrito em algum curso

        return View(db.Cursos.ToList());
    }

    [HttpPost]
    public ActionResult Inscricao(int inscricaoId)
    {
        using (var scope = new TransactionScope())
        {
            //Aqui eu pego o Aluno logado
            Aluno aluno = db.Alunos.FirstOrDefault(a => a.Usuario == System.Web.HttpContext.Current.User.Identity.Name);
            if (aluno == null)
                return View("MeusCursos");

            //Aqui ficaria a parte onde verifica se o aluno já está inscrito em algum curso

            var curso = db.Cursos.FirstOrDefault(c => c.Id == inscricaoId);
            if (curso == null)
                return View("MeusCursos");

            var alunoCurso = new AlunoCurso
            {
                Aluno = aluno,
                Curso = curso
            };

            db.AlunoCursos.Add(alunoCurso);
            db.SaveChanges();

            curso.Qtd_Vagas--;
            db.Entry(curso).State = EntityState.Modified;
            db.SaveChanges();

            scope.Complete();
        }

        return View(db.Cursos.ToList());
    }

Can anyone help me with this?

    
asked by anonymous 08.06.2015 / 15:45

1 answer

1

There is not much secret, actually. Only checking for AlunoCurso is missing:

[HttpPost]
public ActionResult Inscricao(int inscricaoId)
{
    using (var scope = new TransactionScope())
    {
        //Aqui eu pego o Aluno logado
        Aluno aluno = db.Alunos.FirstOrDefault(a => a.Usuario == User.Identity.Name);
        if (aluno == null)
            return View("MeusCursos");

        // Aqui ficaria a parte onde verifica se o aluno já está inscrito em algum curso.
        // Repare que, no seu código antigo, você apenas verifica se o curso
        // existe, e não se o aluno está inscrito nele.
        // Em todo caso, mantive o código antigo porque continua sendo importante 
        // verificar se o curso existe, para evitar usos indevidos do sistema.

        var curso = db.Cursos.FirstOrDefault(c => c.Id == inscricaoId);
        if (curso == null)
            return View("MeusCursos");

        // Aqui eu faço a verificação de fato se o aluno está inscrito no
        // curso ou não.
        var alunoCurso = db.AlunoCursos.FirstOrDefault(ac => ac.Curso.Id == inscricaoId && ac.Aluno.Usuario == User.Identity.Name);
        if (alunoCurso != null)
            return View("MeusCursos");            

        alunoCurso = new AlunoCurso
        {
            Aluno = aluno,
            Curso = curso
        };

        db.AlunoCursos.Add(alunoCurso);
        db.SaveChanges();

        curso.Qtd_Vagas--;
        db.Entry(curso).State = EntityState.Modified;
        db.SaveChanges();

        scope.Complete();
    }

    return View(db.Cursos.ToList());
}

Notice that I have simplified System.Web.HttpContext.Current.User.Identity.Name to User.Identity.Name . They are equivalent.

    
08.06.2015 / 15:55