2010-01-04 14 views
7

Hace tiempo que construí una aplicación ASP.NET MVC, y después de algunos ciclos de mantenimiento me pregunto si adopté el mejor enfoque para la administración del estado. Todo funciona, pero tengo la sensación de que hay una mejor manera.Administración del estado en ASP.NET MVC

El sitio se basa en una funcionalidad de búsqueda que tiene bastantes opciones. Un usuario comienza a usar el sitio completando varias opciones de búsqueda en un formulario y haciendo clic en el botón "buscar". Este botón mensajes al método de búsqueda con todas las opciones de búsqueda se definen como parámetros a los métodos de búsqueda, por ejemplo:

public ActionResult Search(string param1, string param2, string param3, int? param3, long? param4) 

Ahora la página de resultados que se muestra tiene una serie de enlaces en él, dando lugar a diversas páginas de detalles , etc. Desde que necesita el estado de búsqueda para ser preservado en la página de detalles, me encuentro creando ActionLinks con una gran cantidad de parámetros por todo el lugar, tales como:

<%=Html.ActionLink("LinkText", "MethodName", new {id="idOfDetailPage", param1=Model.param1, param2=Model.param2, param3=Model.param3, param4=Model.param4}, null)%> 

la mayor parte de los valores de los parámetros en cada enlace Aún no cambiar desde el estado actual de la búsqueda, pero necesito pasarlos para poder crear otros enlaces en la página de detalles con la c los parámetros de búsqueda actuales, como "volver a los resultados de búsqueda", por ejemplo.

Cuando necesito agregar un parámetro de búsqueda debido a una nueva solicitud de función, me encuentro modificando una gran cantidad de enlaces, así como también los métodos del Controlador a los que conducen los enlaces. Aquí es donde siento que necesito una mejor manera.

He pensado en usar el estado de sesión para mantener los parámetros de búsqueda, pero por alguna razón pensé que esto no era lo mejor para usar en ASP MVC y tengo curiosidad por saber si hay otra manera más clara de hacerlo.

Nota: También he intentado un enfoque en el que uso un objeto fuertemente tipado en ActionLink, pero aún necesito pasar parámetros a ese objeto para que no sea mucho mejor.

Se aprecian todas las ideas.

Respuesta

1

El uso del estado de la sesión para este tipo de cosas siempre es una molestia, ya que significa que estas páginas no pueden ser marcadas y si desea tener más de una pestaña abierta, comienza a complicarse.

Se puede crear una nueva clase SearchParameters:

public class SearchParameters 
{ 
    public string Param1 { get; set; } 
    public string Param2 { get; set; } 
} 

modificar su acción para ser

public ActionResult Search(SearchParameters params) 

y luego pasar esto a la vista a través de los datos de vista.

su punto de vista debe entonces ser capaz de utilizar

<%=Html.ActionLink("LinkText", "MethodName", Model) %> 

Si está usando este por todo el lugar, que le gustaría crear una extensión HtmlHelper:

public static class SearchExtensions 
{ 
    public static string SearchLink<TModel>(this HtmlHelper<TModel> helper, string linkText) 
     where TModel : SearchModel, class //required by ASP.NET MVC 
    { 
     return helper.ActionLink(linkText, "MethodName", modelType.ViewData.Model) %> 
    }  
} 

y entonces su búsqueda es tan simple como:

<%=Html.SearchLink("LinkText") %> 
+0

Esto funciona siempre que siempre pase los mismos parámetros de búsqueda y solo los parámetros de búsqueda al acto ion, como la acción de búsqueda. Sin embargo, me meto en problemas cuando necesito pasar datos adicionales a la acción, como el ID de un elemento (como en el caso de una página de detalles).Entonces no puedo simplemente pasar el Modelo al método de ayuda Html.ActionLink. Además, muchos enlaces requieren que se modifique uno de los parámetros de búsqueda, pero el resto permanece igual, por lo que con este enfoque necesito seguir creando nuevos objetos SearchParameters. Funciona, pero se vuelve complicado después de un tiempo. –

+3

Voy a probar y señalar que las búsquedas de marcadores no siempre son buenas para hacer, sino que dependen del contexto y de la aplicación; esto es especialmente cierto si la búsqueda tiene dependencias que no están expuestas. en los parámetros Dicho esto, creo que esta es una buena generalización (-: – Murph

Cuestiones relacionadas