3 messaggi dal 26 gennaio 2010
buongiorno

premetto che prima di scrivere ho provato a effettuare delle ricerche ma
non ho trovato delle risposte soddisfacenti.

Ho un'applicazione ASP.NET MVC 3 con una pagina di ricerca paginata, con circa 50 parametri.

In precedenza, in un'altra pagina di ricerca più semplice ho utilizzato gli "objectroutes" (MyAction (Object param1, ...)) per recuperare i parametri di ricerca ma in questo, visto il numero di parametri, non credo sia la soluzione corretta.

Inizialmente avevo pensato di utilizzare il viewmodel contenente i parametri di ricerca e memorizzarlo nel TempData, ma mi sono reso conto dopo la seconda HttpRequest viene distrutto.

A questo punto, mi chiedo quale sia la tecnica corretta per conservare i dati tra i vari post. Attualmente il mio codice è qualcosa di questo tipo:

public ActionResult Index(SearchParameterViewModel model, int? id)
{
if (Request.HttpMethod == "GET")
{
if (!id.HasValue)
{
TempData["model"] = null;
return View(model);
}
}
else
{
id = 1;
}

int currentPage = id ?? 1;

if (TempData["model"] == null)
{
TempData["model"] = model;
}
else
{
model = (SearchParameterViewModel)TempData["model"];
}

var filter= CreateFilter(model);
model.searchResult= MyService.Search(filter, currentPage-1)
.AsQueryable().ToPagedList<MyClass>(currentPage, 20);

return View(model);
}

Come posso risolvere? Grazie
Modificato da toolamah il 27 novembre 2012 09.31 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

toolamah ha scritto:

A questo punto, mi chiedo quale sia la tecnica corretta per conservare i dati tra i vari post

Un'Action che riceve dati dal POST può pur sempre ripassarli alla View che li renderizzerà opportunamente, affinché possano essere poi reinviati in un nuovo POST (e il ciclo ricomincia).

Forse però bisogna chiedersi se avere un SearchParameterViewModel con 50 proprietà sia la soluzione migliore.
Per prima cosa, hai questi 50 campi che viaggiano avanti e indietro tra client server, spesso vuoti perché il caso tipico magari vuole che l'utente ne valorizzi uno o due.
Inoltre, non conosco nel dettaglio la tua implementazione ma immagino che il tuo SearchParameterViewModel non ti lasci indicare il criterio con cui effettuare la ricerca. Se ora ti limita ad usare l'operatore "uguale" o "contiene" sarebbe invece auspicabile supportare anche "non contiene" o "finisce con" o "diverso da" o "minore/maggiore di".

E comunque, anche l'interfaccia grafica potrebbe avere i suoi problemi: come presenti i campi all'utente, con 50 textbox? Ouch, potrebbe diventare caotico e difficile da gestire, soprattutto quando i campi cambiano o aumentano.

Proverei a ristrutturare la pagina in questo modo:
  • Nessun ricaricamento di pagina, in modo da non dover far rimbalzare i dati tra client e server. Passerei i criteri di filtro con una richiesta Ajax da cui otterrei i risultati in formato JSON. Li presenterei nella pagina in formato tabellare usando un motore di templating tipo KnockoutJs, o un plugin di jQuery tipo DataTables.
  • L'interfaccia grafica del filtro prevederebbe solo 3 campi: un menu a tendina popolato tramite reflection da cui selezionare il nome del campo; un altro menu a tendina da cui scegliere l'operatore (uguale, diverso, maggiore, ecc..) e una casella di testo in cui inserire il valore. Cliccando un bottone "Aggiungi criterio", accoderei il criterio ad una piccola lista di riepilogo di tutti i criteri aggiunti fino a quel momento. Immediatamente formerei la richiesta Ajax includendo tutti e soli i criteri presenti in quella lista.
  • Lato server preparerei un ApiController o un WCF DataService, in modo da poter interrogare la sorgente dati usando il protocollo OData.
    In alternativa, la richiesta Ajax può essere formata nel modo che preferisci. L'importante è che tu riesca a ricreare un'espressione di filtro da dare in pasto al tuo metodo MyService.Search().


ciao

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.