En mi modelo de vista, tengo una lista de elementos que obtengo de la base de datos y luego los envío a la vista. Me gustaría saber si es posible evitar tener que volver a llenar la propiedad de las opciones cada vez que pulso una acción de publicación y necesito devolver el modelo (para los errores de validación y para qué no).Reutilizar los datos del modelo en una acción posterior
En formularios web, esto no sería necesario.
Editar: No estaba claro. Mi problema es con las opciones de SelectList que uso para DropDownLists. Todo se publica, pero si tengo que regresar a la vista (el modelo no es válido), ¡tengo que volver a cargar las opciones de la base de datos! Quiero saber si esto puede evitarse.
Mi modelo de vista:
public class TestModel
{
public TestModel()
{
Departments = new List<SelectListItem>();
}
public string Name { get; set; }
public int Department { get; set; }
public IEnumerable<SelectListItem> Departments { get; set; }
}
Mi opinión:
@model MvcApplication1.Models.TestModel
@using (Html.BeginForm())
{
@Html.TextBoxFor(m => m.Name)
@Html.DropDownListFor(m => m.Department, Model.Departments)
<input type=submit value=Submit />
}
Mi controlador (no notar el comentario sobre HttpPost):
public ActionResult Index()
{
TestModel model = new TestModel
{
Name = "Rafael",
Department = 1,
Departments = new List<SelectListItem>
{
new SelectListItem { Text = "Sales", Value = "1" },
new SelectListItem { Text = "Marketing", Value = "2", Selected = true },
new SelectListItem { Text = "Development", Value = "3" }
}
};
// Departments gets filled from a database.
return View(model);
}
[HttpPost]
public ActionResult Index(TestModel model)
{
if (!ModelState.IsValid)
{
//Do I have to fill model.Departments again!?!?!?
return View(model);
}
else { ... }
}
Gracias de antemano.
Edit: FYI, mi solución fue utilizar la variable Session
.
¿Me puede ver editar? – rebelliard
OK, veo lo que quieres decir ahora. Tuve el mismo problema con mi último proyecto. Lamentablemente, usar una publicación HTTP limita de forma inherente su modelo al equivalente de pares clave-valor. Es decir, no puede tener un modelo complejo con más objetos comerciales como propiedades devueltas al controlador. Por lo tanto, deberá almacenar la lista de departamentos en algún lugar persistente. La sesión sería apropiada para esto, siempre y cuando la borre cuando haya terminado. Si realmente necesita enviar objetos por cable, debe usar JSON o alguna otra técnica de serialización. – jhsowter
Ya veo. ¿Recomendaría pasar los datos de un JSON dentro de una entrada oculta o un objeto Session []? Gracias. – rebelliard