MVC All DropdownListsFor are returning Error : "The value Cannot be Null, Parameter name:Items" After POST, Works Perfectly populating when GET

Viewed 54

this is my issue, please I need Help :(

Populating the dropdownlists Works Perfectly, in my GET Action result, but after POST, the values of all the dropdownlists return null, I've tried with debugging and also the values seems to be null after POST. Honestly, I don't know what I'm doing Wrong here, I've tried the same method with other ViewModels, Controllers an Views in my project and works perfectly fine, but in this case when I try to Create/Edit registers after POST, gives me this error: [enter image description here][1]

This is my ViewModel

public class CrearBugsViewModel
   {
       public int id { get; set; }
       [Required(ErrorMessage = "*Campo {0} obligatorio")]
       public string Nombre { get; set; }
       [Required(ErrorMessage = "*Campo {0} obligatorio")]
       [DataType(DataType.MultilineText)]
       [Display(Name = "Descripción")]
       public string Descripcion { get; set; }
       [DataType(DataType.Date)]
       [Display(Name = "Fecha Cración")]
       [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
       [Required(ErrorMessage = "*Campo {0} obligatorio")]
       public Nullable<System.DateTime> FechaCreacion { get; set; }       
       public Nullable<int> UsuarioQueReporta { get; set; }     
       public Nullable<int> UsuarioAsignadoAlBug { get; set; }  
       public Nullable<int> Proyecto { get; set; }       
       public Nullable<int> Categoria { get; set; }     
       public Nullable<int> Prioridad { get; set; }   
       public Nullable<int> Estado { get; set; }
       public Nullable<int> UltimoUsuarioQueEdito { get; set; }
       
       [DataType(DataType.Date)]
       [Display(Name = "última fecha de Edición")]
       [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
       [Required(ErrorMessage = "*Campo {0} obligatorio")]
       public Nullable<System.DateTime> UltimaFechaEdicion { get; set; }
       [Required(ErrorMessage = "*Campo {0} obligatorio")]
       [DataType(DataType.MultilineText)]
       [Display(Name = "Ingrese su Query")]
       public string query { get; set; }

       public IEnumerable<SelectListItem> ListaUsuariosQueReporta { get; set; }
       public IEnumerable<SelectListItem> ListaUsuariosAsignadoAlBug { get; set; }
       public IEnumerable<SelectListItem> ListaProyectos { get; set; }
       public IEnumerable<SelectListItem> ListaCategorias { get; set; }
       public IEnumerable<SelectListItem> ListaPrioridades { get; set; }
       public IEnumerable<SelectListItem> ListaEstados { get; set; }
       public IEnumerable<SelectListItem> ListaUltimosUsuariosQueEditaron { get; set; }
   }

This is my Controller

private Bug_TrackEntities db = new Bug_TrackEntities();
        CrearBugsViewModel agregarBugViewModel = new CrearBugsViewModel();
public ActionResult Crear()
        {
            agregarBugViewModel = new CrearBugsViewModel()
            {
                ListaUsuariosQueReporta = db.Usuarios.Select(x => new SelectListItem
                {
                    Value = x.id.ToString(),
                    Text = x.usuario
                }),
                ListaUsuariosAsignadoAlBug = db.Usuarios.Select(d => new SelectListItem
                {
                    Value = d.id.ToString(),
                    Text = d.usuario
                }),
                ListaProyectos = db.Proyecto.Select(x => new SelectListItem
                {
                    Value = x.id.ToString(),
                    Text = x.Nombre
                }),
                ListaCategorias = db.Categoria.Select(x => new SelectListItem
                {
                    Value = x.id.ToString(),
                    Text = x.Nombre
                }),
                ListaPrioridades = db.Prioridad.Select(x => new SelectListItem
                {
                    Value = x.id.ToString(),
                    Text = x.Nombre
                }),
            };
            return View(agregarBugViewModel);
        }
        //POST: Crear
        [HttpPost]
        public ActionResult Crear(CrearBugsViewModel crearBug)
        {
            try
            {
                var Bug = new Models.Bugs();
                if (ModelState.IsValid)
                {
                    Bug.Nombre = crearBug.Nombre;
                    Bug.Descripcion = crearBug.Descripcion;
                    Bug.FechaCreacion = DateTime.Now;
                    Bug.UsuarioQueReporta = crearBug.UsuarioQueReporta;
                    Bug.UsuarioAsignadoAlBug = crearBug.UsuarioAsignadoAlBug;
                    Bug.Proyecto = crearBug.Proyecto;
                    Bug.Categoria = crearBug.Categoria;
                    Bug.Prioridad = crearBug.Prioridad;
                    Bug.Estado = 1;//enviado
                    Bug.UltimaFechaEdicion = DateTime.Now;
                    Bug.UltimoUsuarioQueEdito = null;
                    Bug.query = crearBug.query;
                    db.Bugs.Add(Bug);
                    db.SaveChanges();
                    return Redirect("/Bugs/Index");
                }
                agregarBugViewModel = new CrearBugsViewModel()
                {
                    ListaUsuariosQueReporta = db.Usuarios.Select(x => new SelectListItem
                    {
                        Value = x.id.ToString(),
                        Text = x.usuario
                    }),
                    ListaUsuariosAsignadoAlBug = db.Usuarios.Select(d => new SelectListItem
                    {
                        Value = d.id.ToString(),
                        Text = d.usuario
                    }),
                    ListaProyectos = db.Proyecto.Select(x => new SelectListItem
                    {
                        Value = x.id.ToString(),
                        Text = x.Nombre
                    }),
                    ListaCategorias = db.Categoria.Select(x => new SelectListItem
                    {
                        Value = x.id.ToString(),
                        Text = x.Nombre
                    }),
                    ListaPrioridades = db.Prioridad.Select(x => new SelectListItem
                    {
                        Value = x.id.ToString(),
                        Text = x.Nombre
                    }),
                };
                return View(crearBug);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

This is my view

@model BugTrack.Models.ViewModels.Bugs.CrearBugsViewModel
@{
    ViewBag.Title = "Nuevo Bug";
}

<h2>@ViewBag.Title</h2>
@using (Html.BeginForm("Crear", "Bugs", FormMethod.Post))
{
    <div class="row">
        <div class="col-lg-12">
            <div>
                @Html.LabelFor(d => d.Nombre)
                @Html.TextBoxFor(d => d.Nombre, "", new { @class = "form-control" })
                @Html.ValidationMessageFor(d => d.Nombre, null, new { @class = "rojo-errores" })
            </div>
            <div>
                @Html.LabelFor(d => d.Descripcion)
                @Html.TextBoxFor(d => d.Descripcion, "", new { @class = "form-control" })
                @Html.ValidationMessageFor(d => d.Descripcion, null, new { @class = "rojo-errores" })
            </div>
            <div>
                @Html.LabelFor(d => d.FechaCreacion)
                @Html.EditorFor(model => model.FechaCreacion, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(d => d.FechaCreacion, null, new { @class = "rojo-errores" })
            </div>
            <div>
                @Html.LabelFor(model => model.UsuarioQueReporta, "UsuarioQueReporta")
                @Html.DropDownListFor(model => model.UsuarioQueReporta, new SelectList(Model.ListaUsuariosQueReporta, "Value", "Text"), "--Seleccione un usuario--", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.UsuarioQueReporta, "", new { @class = "text-danger" })
            </div>
            <div>
                @Html.LabelFor(model => model.UsuarioAsignadoAlBug, "UsuarioAsignadoAlBug")
                @Html.DropDownListFor(model => model.UsuarioAsignadoAlBug, new SelectList(Model.ListaUsuariosAsignadoAlBug, "Value", "Text"), "--Seleccione usuario asignado al bug--", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.UsuarioAsignadoAlBug, "", new { @class = "text-danger" })
            </div>
            <div>
                @Html.LabelFor(model => model.Proyecto, "Proyecto")
                @Html.DropDownListFor(model => model.Proyecto, new SelectList(Model.ListaProyectos, "Value", "Text"), "--Seleccione un proyecto--", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Proyecto, "", new { @class = "text-danger" })
            </div>
            <div>
                @Html.LabelFor(model => model.Categoria, "Categoria")
                @Html.DropDownListFor(model => model.Categoria, new SelectList(Model.ListaCategorias, "Value", "Text"), "--Seleccione una categoría--", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Categoria, "", new { @class = "text-danger" })
            </div>
            <div>
                @Html.LabelFor(model => model.Prioridad, "Prioridad")
                @Html.DropDownListFor(model => model.Prioridad, new SelectList(Model.ListaPrioridades, "Value", "Text"), "--Seleccione prioridad--", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Prioridad, "", new { @class = "text-danger" })
            </div>
            <div>
                @Html.LabelFor(d => d.query)
                @Html.TextBoxFor(d => d.query, "", new { @class = "form-control" })
                @Html.ValidationMessageFor(d => d.query, null, new { @class = "rojo-errores" })
            </div>
            <br />
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-success" />
                </div>
            </div>
        </div>
    </div>
}

And This is What I've tried in the past with another ViewModel,Controller,View and worked fine for me:

ViewModel

public class CrearUsuariosAsignadosAlProyectoViewModel
    {
        [HiddenInput(DisplayValue = false)]
        public int id { get; set; }
        [Required(ErrorMessage = "*Campo {0} obligatorio")]
        public Nullable<int> Proyecto { get; set; }
        public IEnumerable<SelectListItem> ListaProyectos { get; set; }
        [Display(Name = "Usuario que desea asignar al Proyecto")]
        [Required(ErrorMessage = "*Campo {0} obligatorio")]
        public Nullable<int> Usuario { get; set; }
        public IEnumerable<SelectListItem> ListaUsuarios { get; set; }
        public string NombreUsuario { get; set; }
        public string NombreProyecto { get; set; }
    }

Controller

public ActionResult Crear()
        {
            crearUsuariosAsignadosAlProyectoView = new CrearUsuariosAsignadosAlProyectoViewModel
            {
                ListaProyectos = db.Proyecto.Select(x => new SelectListItem
                {
                    Value = x.id.ToString(),
                    Text = x.Nombre
                }),
                ListaUsuarios = db.Usuarios.Select(x => new SelectListItem
                {
                    Value = x.id.ToString(),
                    Text = x.usuario
                })
            };
            return View(crearUsuariosAsignadosAlProyectoView);
        }
        //POST: Crear
        [HttpPost]
        public ActionResult Crear(CrearUsuariosAsignadosAlProyectoViewModel agregarUsuariosAsignados)
        {
            try
            {
                var usuarioAsignado = new Models.UsuariosAsignadosAlProyecto();

                if (ModelState.IsValid)
                {
                    usuarioAsignado.Proyecto = agregarUsuariosAsignados.Proyecto;
                    usuarioAsignado.Usuario = agregarUsuariosAsignados.Usuario;
                    db.UsuariosAsignadosAlProyecto.Add(usuarioAsignado);
                    db.SaveChanges();
                    return Redirect("/UsuariosAsignadosAlProyecto/Index");
                }
                var listas = new CrearUsuariosAsignadosAlProyectoViewModel
                {
                    ListaProyectos = db.Proyecto.Select(x => new SelectListItem
                    {
                        Value = x.id.ToString(),
                        Text = x.Nombre
                    }),
                    ListaUsuarios = db.Usuarios.Select(x => new SelectListItem
                    {
                        Value = x.id.ToString(),
                        Text = x.usuario
                    })
                };
                return View(agregarUsuariosAsignados);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

View

<div>
                @Html.LabelFor(model => model.Proyecto, "Proyecto")
                @Html.DropDownListFor(model => model.Proyecto, new SelectList(Model.ListaProyectos, "Value", "Text"), "--Seleccione un proyecto--", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Proyecto, "", new { @class = "text-danger" })
            </div>
            <div>
                @Html.LabelFor(model => model.Usuario, "Usuario")
                @Html.DropDownListFor(model => model.Usuario, new SelectList(Model.ListaUsuarios, "Value", "Text"), "--Seleccione un usuario para asignar--", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Usuario, "", new { @class = "text-danger" })
            </div>

As you can see, first I declare Ienumerable SelectListItems objects in ViewModel, then in the controller I Select data from my database and store it in these SelectItems Objects, which are the same in the GET action result and POST, then In my view I pass these objects as dropdownlistsfor Items which are populated perfectly fine, and finally when user selects options it store the register in the database. [1]: https://i.stack.imgur.com/rmpRY.png

2 Answers
return View(crearBug);

You are returning your posted model, not the viewmodel created after post filled up. Should be

return View(agregarBugViewModel);

After I've tried 4 ways to do the same behavior an getting the same bug, I decided to clear my viewmodel and started from zero, which made me figure out that the validation "[Required(ErrorMessage = "*Campo {0} obligatorio")]" used in most of my attributes (including the ones used to get the values from the dropdownlistsfor) we're affecting the POST behavior, this is my viewmodel now:

public int id { get; set; }
    [Required(ErrorMessage = "*Campo {0} obligatorio")]
    public string Nombre { get; set; }
    [Required(ErrorMessage = "*Campo {0} obligatorio")]
    public string Descripcion { get; set; }
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [Required(ErrorMessage = "*Campo {0} obligatorio")]
    public Nullable<System.DateTime> FechaCreacion { get; set; }        
    public Nullable<int> UsuarioQueReporta { get; set; }      
    public Nullable<int> UsuarioAsignadoAlBug { get; set; } 
    public Nullable<int> Proyecto { get; set; }
    public Nullable<int> Categoria { get; set; }
    public Nullable<int> Prioridad { get; set; }
    public Nullable<int> Estado { get; set; }        
    public Nullable<int> UltimoUsuarioQueEdito { get; set; }
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]        
    public Nullable<System.DateTime> UltimaFechaEdicion { get; set; }
    [Required(ErrorMessage = "*Campo {0} obligatorio")]
    public string query { get; set; }
    public IEnumerable<SelectListItem> ListaUsuariosQueReporta { get; set; }
    public IEnumerable<SelectListItem> ListaUsuariosAsignadoAlBug { get; set; }
    public IEnumerable<SelectListItem> ListaProyectos { get; set; }
    public IEnumerable<SelectListItem> ListaCategorias { get; set; }
    public IEnumerable<SelectListItem> ListaPrioridades { get; set; }
    public IEnumerable<SelectListItem> ListaEstados { get; set; }
    public IEnumerable<SelectListItem> ListaUltimosUsuariosQueEditaron { get; set; }

now I'm able to create registers as always

Related