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