Pregunta

Tengo una Vista de lista que tiene un ViewModel fuertemente tipado que incluye la lista de entidades con la que estoy trabajando junto con algunas otras cosas de tipo sesión que llevo alrededor.

Al hacer clic en un elemento de la lista (un Html.ActionLink) para ir a la vista Detalles, puedo pasar fácilmente la identificación de la entidad. Pero también quiero pasar el resto del ViewModel de la Vista.

Puedo construir el ActionLink con varios parámetros de QueryString y luego un ModelBinder personalizado puede recogerlos e hidratar el objeto ViewModel para mí nuevamente. Sin embargo, no me gusta esto.

Puedo hacer que el ViewModel personalizado se rehidrate cuando se PUBLICA de nuevo en la misma página, etc., pero ¿cómo puedo obtener el ViewModel en una Acción del Controlador usando un GET a otra Vista sin usar un ModelBinder y simplemente colocando el ViewModel objeto como parámetro en el método de acción de destino?

¿Fue útil?

Solución

No creo que puedas hacer lo que quieras, que de lo que deduzco es lo siguiente:

  1. Al representar la acción Lista, desea crear un enlace a otra acción (potencialmente en otro controlador, pero eso no es clave aquí)

  2. Esta acción, cuando se activa, debe tener acceso al ViewModel original que existía cuando se ejecutó por primera vez el método ActionLink.

Desafortunadamente, los elementos # 1 y # 2 están completamente desconectados entre sí y, por lo tanto, no existe un mecanismo real para pasar el ViewModel actual a un enlace que se ejecutará en una sesión diferente.

Eso no quiere decir que no haya soluciones, por supuesto:

Puede generar el enlace de acción de esta manera:

<%= 
    Html.ActionLink( 
                    "Label", 
                    "Action",  
                    "Controller",
                    new {Parameter1 = Model.Data1, Parameter2 = Model.Data2},
                    null
                   ) 
%> 

Dentro de su método de acción vinculado, puede crear una instancia de ViewModel utilizando los parámetros pasados ??a ese método de acción.

Otros consejos

Acabo de intentar esto y parecía funcionar. También probé el sin forma y funcionó también. Sin embargo, no estoy seguro de si esto es exactamente lo que quería.

Acción

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index(TestModel model)
{
  ViewData["Message"] = model.Test1;
  return View();
}

Modelo

public class TestModel
{
  public string Test1 { get; set; }
  public string Test2 { get; set; }
}

View

<% using (Html.BeginForm("Index","Home",FormMethod.Get))
{ %>
        <%=Html.TextBox("Test1")%>
        <%=Html.TextBox("Test2")%>
        <input type=submit value=submit />
<% }%>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top