0

Necesito renderizar en mi vista una serie de campos tipo checkbox (9 en total) en donde si uno de ellos (el numero 8) al momento de hacer clic en el debería aparecer un campo tipo select, esto ultimo ya lo tengo desarrollado con jquery el tema de la animación para mostrar y ocultar el div. El problema que tengo esta en renderizar los inputs en la view con razor, hacer el modelo y manejar los datos en el controlador. Todos son datos estáticos.

Probé haciendo lo siguiente:

Model

Este seria para los campos de tipo checkbox

public class MiModeloCheckbox
{
    public MiModeloCheckbox()
    {
        this.Checkbox = new List<Checkbox>();
    }

    public List<Checkbox> Checkbox { get; set; }

    public class Checkbox
    {
        public bool IsSelected { get; set; }
        public int Codigo { get; set; }
        public string Nombre { get; set; }
    }
}

*Este seria para el campo de tipo select

public class MiModeloSelect
{
    public List<SelectListItem> Autos { get; set; }
    public List<int> SelectedAutos { get; set; }
}

*Finalmente cree un nuevo modelo para unir los dos anteriores y poder enviarlos a la vista desde mi controller.

public class Input
{
    public MiModeloCheckbox MiModeloCheckbox { get; set; }
    public MiModeloSelect MiModeloSelect { get; set; }
}

En mi controller tengo lo siguiente

public async Task<ActionResult> Index()
    {
        // Logic

        Input input = new Input();
        input.MiModeloSelect.Autos = new List<SelectListItem>
        {
            new SelectListItem { Value = "1", Text = "AUTO 1" },
            new SelectListItem { Value = "2", Text = "AUTO 2" },
            new SelectListItem { Value = "3", Text = "AUTO 3" }
        };

        return View(input);
    }

Pero en esta linea input.MiModeloSelect.Autos me da una excepción justo en Autos que dice lo siguiente:

input.MiModeloSelect.Autos = 'input.MiModeloSelect.Autos' inició una excepción de tipo 'System.NullReferenceException'

En mi vista ocupo lo siguiente:

@model MiProyecto.Models.Input

@Html.ListBoxFor(m => m.MiModeloSelect.SelectedAutos, Model.MiModeloSelect.Autos)

No se como poder resolver este problema, ¿alguien que me pueda ayudar?

vicasas
  • 1,308
  • 1
  • 11
  • 37
  • Tu respuesta que habías dejado no la alcance a terminar de leer, ¿podrías volver a publicarla? para ver el ejemplo que colocaste, enseguida leeré el link que me dejaste. – vicasas Jun 05 '18 at 15:53
  • ok, la he recuperado aunque no debería haberla respondido probablemente. Ya que está hecha, mira a ver si te sirve – Pikoh Jun 05 '18 at 15:55

1 Answers1

1

Cuando haces Input input = new Input(); creas una instancia de Input, pero las variables internas de la clase permanecen a null si no las inicializas. Tienes un par de opciones:

  1. Inicializarlo en el constructor de la clase:

    public class Input
    {
        public MiModeloCheckbox MiModeloCheckbox { get; set; }
        public MiModeloSelect MiModeloSelect { get; set; }
    
        public Input()
        {
              this.MiModeloCheckbox = new MiModeloCheckbox();
              this.MiModeloSelect = new MiModeloSelect();  
        }
    }
    
  2. Inicializarlo al crear la instancia de la clase manualmente:

    Input input = new Input();
    input.MiModeloCheckbox = new MiModeloCheckbox();
    input.MiModeloSelect = new MiModeloSelect();   
    

Un par de consideraciones adicionales:

  1. Es muy mala práctica llamar a una propiedad igual que su clase, lleva a equívocos y hace más difícil leer el código.

  2. Este problema te ocurrirá "recursivamente". Quiero decir que al hacer por ejemplo input.MiModeloSelect = new MiModeloSelect();, creas una instancia de MiModeloSelect, pero tanto Autos como SelectedAutos serán null. Por eso te recomiendo en cada clase crear un constructor e iniciar las propiedades ahi como te puse en mi primer ejemplo.

Pikoh
  • 17,305
  • 9
  • 38
  • 54
  • Si me sirvió demacrado, de igual forma te doy un +1 por como dices que estaba repetida, ahora echare un vistazo al link que me dejaste. Muchas gracias (: – vicasas Jun 05 '18 at 16:05