TransWikia.com

Nulo en model mvc

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

Tengo este problema:

System.NullReferenceException: 'Referencia a objeto no establecida como instancia de un objeto.'

introducir la descripción de la imagen aquí

Vista:

@model IEnumerable<ProvidusHomeWeb.Models.Usuarios>

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <meta charset="utf-8">
    <title>Providus</title>
</head>
<body>
    @foreach (var item in Model)
    {
        @Html.DisplayFor(modelitem=> item.usuario)   
    }
</body>
</html>

Controlador:

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

                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("");
        }
    }

Clase:

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

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

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;
            }
        }

Entiendo que el problema es que no le estoy pasando el modelo al controlador pero, ¿Cómo lo soluciono?

One Answer

Puedes utilizar View("ViewName", model) en controler donde defines el nombre de la vista, con su respectivo modelo dependiendo si la vista no pertenece a la accion actual del controlador. las vistas deberan pertenecer a las acciones del controlador

Ejemplo:

 if (usuario[0].nivel == 0
                    || usuario[0].nivel == 1
                    || usuario[0].nivel == 2
                    || usuario[0].nivel == 7)
                {
                    return View(usuario);//suponiendo que esta es la vista de la accion actual
                }
                else if (usuario[0].nivel == 3
                    || usuario[0].nivel == 4
                    || usuario[0].nivel == 16)
                {
                    return View("Login2",usuario);
                }
                else 
                {
                    return View("Index",usuario);
                }

En caso de que las vista pertenescan a un controlador distinto puedes utilizar.

return RedirectToAction("nombreAccion", "nombreController", modelo)

si requieres solo el acceso detalle del modelo usuario y no a una coleccion de usuarios aplica en la accion:

return View(usuario[0]) y en la vista @model ProvidusHomeWeb.Models.Usuarios

Answered by jcHernande2 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