viernes, 24 de marzo de 2017

ASP.NET MVC. Propiedades del objeto a null en el parámetro de la acción.

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

         }

No hay comentarios: