Nos llegó un paciente que se encontraba confuso, no recordaba quién era, no sabía dónde estaba ni qué hacía allí, intentamos ver el porqué de su amnesia...
En ocasiones tendremos que en un formulario no
necesitamos rellenar algunas propiedades del modelo, y veremos que dichas
propiedades del objeto vienen a null al utilizar una acción a la que le pasamos
por parámetro ese objeto del modelo desde la vista, para crear o editar por
ejemplo.
Esto sucede porque no teníamos los campos en la vista,
ya que al no necesitar editarlos pues no les hemos puesto controles.
Cuando tengamos un campo que no necesitemos editar,
pero sí necesitemos conservar su valor después del postback tenemos las
siguientes opciones:
1.
Poner dichos
campos en hiddens dentro del form, de modo que viajen con el postback, la más
recomendable
Vista:
@Html.HiddenFor(model => model.MiCampo)
@Html.EditorFor(model => model.OtroCampo)
Controlador:
Sin olvidarnos
de incluirlo en el binding del parámetro de la acción.
public ActionResult Edit([Bind(Include = "MiCampo","OtroCampo")] MiEntidad entidad)
{
//hacer cosas
}
2.
Inicializar
dichos campos dentro de la acción. Nos obligará a repetir el código en todas
las acciones.
Vista:
@Html.EditorFor(model => model.OtroCampo)
Controlador:
public ActionResult Edit([Bind(Include = "OtroCampo")] MiEntidad entidad)
{
entidad.MiCampo
= "valor";
//guardar. Otro campo sí desponía de un
control editable en la vista
}
3.
Guardar el id
del objeto en un hidden, buscar el objeto desde la base de datos con un Find e
inicializar las propiedades del objeto buscado a los valores de las propiedades
editables del objeto que viene por parámetro. Este método es recomendable si
tenemos un formulario de display, pero que tiene unos poquitos campos que sí
serían editables. Imaginemos una vista que muestra en sólo lectura diez valores
y hay un campo que podemos rellenar y un botón para enviar.
Vista:
@Html.HiddenFor(model =>
model.IdEntidad)
@*otros campos dentro de DisplayFor*@
@Html.EditorFor(model => model.OtroCampo)
Controlador:
public ActionResult Edit([Bind(Include = "IdEntidad", "OtroCampo")] MiEntidad entidad)
{
Entidades bd = new Entidades();
MiEntidad guardable = bd.Find(IdEntidad);
//campo a rellenar, el resto estaban en sólo
lectura y los acabamos de sacar de BD
//porque en el parámetro vienen a null
guardable.OtroCampo
= entidad.OtroCampo;
//guardar
}