TransWikia.com

Login Mvc con sql sin entity

Stack Overflow en español Asked on November 27, 2021

Tengo una cuestión, necesito hacer un login que me mande a una página específica según el nivel de usuario. Es decir, a modo de ejemplo:

**Usuario nivel 1 -> pagina1
Usuario nivel 2 -> pagina2**

Pero, no me estaría resultando ya que me sale que no se encuentra la vista Login. Por lo que necesito saber si estoy haciéndolo bien.

Clase:

public class Usuarios
    {
        public string usuario { get; set; }
        public string clave { get; set; }
        public decimal? nivel { get; set; }

        public Usuarios(string usuario, string clave, decimal? nivel) 
        {
            this.usuario = usuario;
            this.clave = clave;
            this.nivel = nivel;
        }
    }

Clase ConexionSQL:

public List<Usuarios> login(string usu, string cla)
        {
            List<Usuarios> salida = new List<Usuarios>();
            string con = "cadena";
            using (SqlConnection connection = new SqlConnection(con))
            {
                connection.Open();
                string sql = "SELECT Count(*), nivel " +
                    "FROM usuarios " +
                    "WHERE usuario = @usu " +
                    "AND clave = @cla " +
                    "AND AccesoSistemaProvidus = 1";
                SqlCommand cmd = new SqlCommand(sql, connection);
                cmd.Parameters.AddWithValue("@usu", usu);
                cmd.Parameters.AddWithValue("@cla", cla);
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    string usuario = dr["usuario"]?.ToString();
                    string clave = dr["clave"]?.ToString();
                    decimal? nivel = Convert.ToDecimal(dr["nivel"]?.ToString());
                    Usuarios u = new Usuarios(usuario, clave, nivel);
                    salida.Add(u);
                }
                connection.Close();
                return salida;
            }
        }

Controlador:

public ActionResult Index()
        {
            return View();
        }


public ActionResult Login(string usu, string cla)
    {
        try
        {
            ConexionSQL sql = new ConexionSQL();
            var caracteres = Convert.ToString(cla);
            var usuario = sql.login(usu, cla);

            if (usuario.Count <= 0)
            {
                ViewBag.MensajeUsuario = "El usuario es inexistente.";
            }
            else if (usuario[0].nivel == 0
                || usuario[0].nivel == 1
                || usuario[0].nivel == 2
                || usuario[0].nivel == 7)
            {
                return View("Login1");
            }
            else if (usuario[0].nivel == 3
                || usuario[0].nivel == 4
                || usuario[0].nivel == 16)
            {
                return View("Login2");
            }
            else 
            {
                return View("Index");
            }
        }
        catch (SqlException ex)
        {
            throw ex;
        }
        return View("");
    }

Index:

<form class="modal-content animate" method="post" action="@Url.Action("Login", "Home")">
            <div class="imgcontainer">
                <span onclick="document.getElementById('id01').style.display='none'" class="close" title="Close Modal">&times;</span>
                <img src="~/Images/00.png" alt="Avatar" class="avatar">
            </div>

            <div class="container">
                <label for="uname"><b>Usuario:</b></label>
                <input type="text" placeholder="Ingrese usuario..." name="uname" required>

                <label for="psw"><b>Contraseña:</b></label>
                <input type="password" placeholder="Ingrese contraseña..." name="psw" required>

                <button type="submit">Iniciar sesión</button>
                <label>
                    <input type="checkbox" checked="checked" name="remember"> Recuérdame
                </label>
            </div>
        </form>

Login1:

<p>Nivel 1</p>

Login2:

<p>Nivel 2</p>

¿Qué es lo que está mal? Porque me sale este error:

System.Data.SqlClient.SqlException: La consulta con parámetros '(@usu nvarchar(4000),@cla nvarchar(4000))SELECT Count(*), nivel ' espera el parámetro '@usu', que no se ha proporcionado.

¿Sugerencias?

2 Answers

Respuesta super compacta: Porque es nulo

Motivo del por qué es nulo:

En tu controlador, pides usu y cla:

public ActionResult Login(string usu, string cla)

En tu vista, estás definiendo a usu como uname y a cla como psw:

<input type="text" placeholder="Ingrese usuario..." name="uname" required>
<input type="password" placeholder="Ingrese contraseña..." name="psw" required>

Solución:

  1. Corregir el nombre.
  2. Acomodar la ruta adecuadamente.

En la configuración de tus rutas:

routes.MapRoute(    
"nombreDeLaRuta",    
"Login/{usu}/{cla}",    
new { controller = "Login", action = " Login", usu= UrlParameter.Optional, cla = UrlParameter.Optional }    
);

Dato importante: Cuida las claves, normalmente van en un POST y no mostrándose en una URL.

Answered by fredyfx on November 27, 2021

Los nombres de los parámetros de la acción en un controlador deben coincidir con el nombre de los parámetros que se están enviando en la petición http.

Si la acción Login() espera los parámetros : usu y cla entonces en el formulario deben llamarse de igual forma. En este caso, en el formulario, el nombre de usuario es: uname y la contraseña es: psw. Por esa razón en la acción no se les asigna un valor.

Answered by Lobos on November 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP