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

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

这是我的问题,我需要帮助:(

填充下拉列表非常有效,在我的 GET 操作结果中,但是在 POST 之后,所有下拉列表的值 return 为空,我已经尝试调试并且这些值似乎在 POST 之后为空。 老实说,我不知道我在做什么 在这里错了,我在我的项目中尝试了与其他 ViewModels、Controllers 和 Views 相同的方法并且工作得很好,但在这种情况下,当我尝试 Create/Edit在 POST 之后注册,给我这个错误:[在此处输入图片描述][1]

这是我的 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; }
   }

这是我的控制器

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

这是我的看法

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

这是我过去用另一个 ViewModel、Controller、View 尝试过的方法,对我来说效果很好:

视图模型

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

控制器

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

查看

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

如您所见,首先我在 ViewModel 中声明了 Ienumerable SelectListItems 对象,然后在控制器中我从数据库中 Select 数据并将其存储在这些 SelectItems 对象中,在 GET 操作结果和 POST 中相同,然后在我看来,我将这些对象作为下拉列表传递给填充得非常好的项目,最后当用户选择选项时,它将寄存器存储在数据库中。 [1]: https://i.stack.imgur.com/rmpRY.png

return View(crearBug);

您返回的是 posted 模型,而不是 post 填满后创建的视图模型。应该是

return View(agregarBugViewModel);

在我尝试了 4 种方法来执行相同的行为并遇到相同的错误后,我决定清除我的视图模型并从零开始,这让我发现大多数情况下使用的验证 "[Required(ErrorMessage = "*Campo {0} obligatorio")]"我的属性(包括用于从下拉列表中获取值的属性)我们正在影响 POST 行为,现在这是我的视图模型:

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

现在我可以像往常一样创建寄存器