2010-11-16 11 views
12

Mi vista se parece a esto:ASP.NET MVC - Trouble modelo de paso en routeValues ​​Html.ActionLink

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<TMS.MVC.BusinessSystemsSupport.Models.SearchDataTypeModel>" %> 


<table class="classQueryResultsTable"> 
    <!-- the header --> 
    <tr class="headerRow"> 

     <td> 
     <%= Html.ActionLink("Effective Startdate", 
        "SortDetails", 
        "DataQryUpdate", 
        new 
        { 
         model = Model, 
         sortBy = "EffectiveStartDate", 
        }, 
        new { @class = "classLinkLogDetails" })%> 
     </td> 

    </tr> 


</table> 

Mi acción del controlador:

public ActionResult SortDetails(SearchDataTypeModel model, String sortBy) 
    { 

El modelo de parámetro es nulo. El parámetro sortBy está lleno. Puedo pasar una propiedad String del modelo a la acción sin ningún problema. Sin embargo, quiero pasarle a todo el modelo.

¿Alguna idea de lo que estoy haciendo mal?

Respuesta

3

Otra opción es conservar los datos que necesita en TempData. Esto lo entregará a la siguiente solicitud, y puede recuperarlo allí. Debería poder persistir todo el objeto modelo si lo desea.

Pero es más fácil (y una mejor práctica) simplemente recuperarlo de la base de datos, como sugiere Darin.

+1

TempData solo se debe usar si es seguido inmediatamente por un redireccionamiento después de ser almacenado y recuperado de TempData en la acción redirigida. No lo usaría en este escenario. –

17

No se puede pasar objetos complejos:

new 
{ 
    model = Model, 
    sortBy = "EffectiveStartDate", 
}, 

model = Model no tiene sentido y no se pueden enviar utilizando GET. Es posible que necesite usar un formulario con una plantilla de editor y/o campos ocultos para enviar todas las propiedades del modelo. Recuerde que solo se pueden enviar valores escalares en la cadena de consulta (clave1 = valor1 & clave2 = valor2 ...). Otra alternativa que viene a la mente es la de enviar sólo el ID:

new 
{ 
    modelId = Model.Id, 
    sortBy = "EffectiveStartDate", 
}, 

y en su acción de controlador buscar el modelo dado este id de su almacén de datos:

public ActionResult SortDetails(int modelId, String sortBy) 
{ 
    var model = repository.GetModel(modelId); 
    ... 
} 

Por supuesto, esto sólo es cierto si el usuario no debe editar las propiedades del modelo en un formulario. Depende de tu escenario

Y, para completar, déjenme exponer otra opción: usar el ayudante Html.Serialize de MVC Futures para serializar todo el modelo en un campo oculto que podría pasarse a la acción del controlador y deserializarse allí.

+0

sólo parámetros de cadena Así que, básicamente simples? –

+3

Yeap, cadenas simples, así es como funciona el protocolo HTTP. Otra alternativa es enviar solo la ID y en la acción del controlador usar un repositorio para obtener su modelo de esta ID del almacén de datos. –

+0

@Darin, para modelId = Model.Id, ¿qué sucede si el Id está en la Lista (de otro modelo) dentro del Modelo? Me gusta @ Html.DisplayFor (model => model.innerModel [i] .Name) y ahora necesito pasar el objeto del modelo interno para ", false) });