MVC 所有 DropdownListsFor 都返回错误:“值不能为空,参数名称:项目”POST 后,在 GET

问题描述

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

填充下拉列表效果很好,在我的 GET Action 结果中,但是在 POST 之后,所有下拉列表的值都返回 null,我已经尝试调试,并且在 POST 之后这些值似乎也为 null。 老实说,我不知道我在这里做错了什么,我在我的项目中尝试了与其他 viewmodels、Controllers 和 Views 相同的方法并且工作得很好,但是在这种情况下,当我尝试在之后创建/编辑寄存器时POST,给我这个错误:[在此处输入图像描述][1]

这是我的视图模型

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(),ListaPrioridades = db.Prioridad.Select(x => new SelectListItem
                {
                    Value = x.id.ToString(),};
            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(),ListaPrioridades = db.Prioridad.Select(x => new SelectListItem
                    {
                        Value = x.id.ToString(),};
                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,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,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,"--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,"--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,"--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,"--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,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(),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(),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,new { @class = "text-danger" })
            </div>
            <div>
                @Html.LabelFor(model => model.Usuario,"Usuario")
                @Html.DropDownListFor(model => model.Usuario,new SelectList(Model.ListaUsuarios,"--Seleccione un usuario para asignar--",new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Usuario,new { @class = "text-danger" })
            </div>

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

解决方法

npm install something

您返回的是您发布的模型,而不是帖子填充后创建的视图模型。应该

return View(crearBug);
,

在我尝试了 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; }

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...