¿Cómo pasar un objeto modificado sin persistencia de la vista al controlador sin un formulario?

StackOverflow https://stackoverflow.com/questions/295200

  •  08-07-2019
  •  | 
  •  

Pregunta

Corto: ¿cómo pasa la vinculación de modelos de los objetos de la vista al controlador?

Largo:
Primero, en función de los parámetros dados por el usuario a través de un formulario de búsqueda, algunos objetos se recuperan de la base de datos. Estos objetos reciben metadatos que son visibles (pero no definitorios) para el cliente (por ejemplo: los nombres y los precios de los objetos difieren de una región a otra). Más adelante en el sitio, el usuario puede hacer clic en enlaces que deberían mostrar detalles de estos objetos. Debido a que estos metadatos son importantes para mostrar, pero no para definir, necesito recuperar el objeto previamente alterado en el controlador. Cuando uso el modelo de enlace asp.net mvc predeterminado, se usa el método .ToString (). Esto, por supuesto, no devuelve una cadena relevante para recrear el objeto completo.
Me habría imaginado que la interfaz ISerializable estaría involucrada, pero esto no es así. ¿Cómo debo obtener el efecto deseado? No puedo imaginar que soy el primero en enfrentar esta pregunta, así que supongo que me falta algo en alguna parte ...

¿Fue útil?

Solución

El enlace del modelo predeterminado toma parámetros de forma por nombre y los empareja con las propiedades del tipo especificado en la lista de argumentos. Por ejemplo, su modelo tiene propiedades " Precio " y '' Nombre '', entonces el formulario debería contener entradas con id / nombres '' Precio '' y " Nombre " (Sospecho que hace una coincidencia entre mayúsculas y minúsculas). El cuaderno utiliza la reflexión para convertir los valores de formulario asociados con estas claves en el tipo apropiado y lo asigna a las propiedades de un objeto recién creado del tipo especificado por el parámetro (nuevamente derivado por reflexión).

En realidad, puede ver (y descargar) la fuente para esto en http://www.codeplex.com / aspnet , aunque tendrá que profundizar en la fuente MVC desde allí. Daría un enlace a la fuente DefaultModelBinder, pero la forma en que están construidas, creo que el enlace cambia a medida que se introducen las revisiones.

Entonces, para responder a su pregunta, necesita tener parámetros (podrían estar ocultos) en su formulario que correspondan a las propiedades del objeto que desea recrear. Cuando PUBLICA el formulario (en la vista) en el controlador, el cuaderno debe reconstituir un objeto del tipo especificado utilizando los parámetros del formulario. Si necesita hacer una traducción de los valores en el parámetro del formulario a las propiedades del objeto, probablemente necesitará implementar su propio cuaderno de modelo personalizado.

[EDITAR] En respuesta a tu segunda publicación:

Digamos que queremos tener un enlace de regreso a una acción que use un objeto personalizado. Podemos almacenar el objeto personalizado en TempData (o la Sesión si necesitamos que dure más en más de una devolución de datos) con una clave particular. Luego podemos construir el enlace de acción y proporcionar la clave del objeto como valor para ActionLink en una clase anónima. Esto devolverá la clave como un parámetro de solicitud. En nuestra acción, podemos usar la clave de este parámetro para recuperar el objeto de TempData.

<%= Html.ActionLink( ViewData["CustomObject1",
                     "Select",
                     new { TempDataKey = ViewData["CustomObject1_Key"] }
                   ) %>
&nbsp;

public ActionResult Select()
{
    Entity custObj = null;
    string objKey = Request.Params["TempDataKey"];
    if (!string.IsNullOrEmpty(objKey))
    {
       custObj = (Entity)TempData[objKey];
    }

    ... continue processing
}

Otros consejos

@tvanfosson

Gracias por su explicación, pero ¿qué pasa con los enlaces? (sin formularios involucrados) Actualmente, Html.ActionLink (c = > c.Action (parámetro), " label ") toma objetos como parámetro. Estos tienen que ser traducidos a partes de URL. Para esto, MVC SIEMPRE va al método .ToString (). No quiero serializar mi objeto en el método ToString.
¿No debería poder ayudar de alguna manera al framework a serializar mi objeto? ¿Diga a través de la interfaz ISerialize o algo así?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top