Domanda

Attualmente sto lavorando a un'app MVC ragionevolmente semplice che consente all'utente di inserire alcuni dati di ricerca, ottenere un elenco di risultati, quindi visualizzare ogni elemento ecc. Va tutto piuttosto bene, tuttavia ora sto cercando di implementare cercapersone ma avendo qualche problema.

Il mio modulo di ricerca utilizza HTTP GET, richiedendo la seguente azione:

public ActionResult Results(PropertySearchData data, int? page)
{
    ...
    IEnumerable<Property> search = mService.SearchProperties(data);

    ViewData["SearchData"] = data;
    return View("Results", "Site", search.ToPagedList(page ?? 0, 20));
    ...
}

Da qui costruisco la mia tabella di risultati dalla raccolta IEnumerable passata nella mia vista. Inoltre, ho usato ViewData per conservare i parametri di ricerca in modo da poterli trasmettere quando l'utente richiede una pagina diversa.

Ad esempio, per arrivare alla prima pagina, vorrei usare qualcosa del genere:

Html.ActionLink("First", "Results", new { data = ViewData["SearchData"], page = 1 })

Tuttavia, quando questo link viene generato, il mio link è lungo le linee di

/Results?data=PropertySearchData&page=1

Se rimuovo completamente il parametro 'page' e passo semplicemente ViewData [" SearchData "] come valore del mio percorso, il mio link viene generato come mi piacerebbe (ovvero ogni membro di PropertySearchData viene passato come stringa di query tramite la funzione di associazione del modello. Immagino che ciò sia dovuto al fatto che l'associazione del modello può funzionare correttamente solo quando hai specificato un solo tipo?

Riesco a vedere diversi motivi per cui questo non funziona; quello con cui ho problemi è trovare il modo "carino" di fare quello che sto cercando di fare. So che qui mi manca una chiave di comprensione vitale, quindi sarebbe molto apprezzato se potessi ottenere alcuni suggerimenti su come affrontarlo.

Nota che voglio davvero restare con HTTP GET (visto che si tratta di una pagina dei risultati di ricerca).

Grazie!

È stato utile?

Soluzione

Il problema è che il metodo helper sta solo provando che è meglio generare qualcosa da quello che gli hai dato e che è un oggetto con due proprietà: data e page.

Per ottenere il numero di pagina è possibile utilizzare un dizionario dei valori del percorso (che è probabilmente quello che viene fatto comunque sotto il cofano) e utilizzare la sostituzione che accetta un IDictionary: -

//In some HtmlHelper extension method or something 
var searchCriteria = new RouteValueDictionary(ViewData["searchData"]);
searchCriteria.Add("page", 1);

return Html.ActionLink("First", "Results", searchCriteria)

Altri suggerimenti

Poiché data o ViewData [" SearchData "] è in istanza di PropertySearchData suppongo che Html.ActionLink sta chiamando ToString () e non sta dando il risultato che ti aspetteresti.

La creazione di un metodo di estensione HtmlHelper non sarebbe il modo migliore per risolverlo. Non aggiungerà funzionalità generali, solo più confusione (visiva) ...

Il sovraccarico routeValues ??di Html.ActionLink prevede un oggetto o RouteValueCollection (IDictionary). Ora stai utilizzando il sovraccarico di oggetti (poiché il nuovo {} costruttore è un oggetto anonimo).

È possibile utilizzare quanto segue per creare il parametro routeValues ??corretto:

new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } }

Questo inizializza un nuovo RouteValueCollection con i dati di ricerca correnti e quindi aggiunge la chiave 'page' con il nuovo valore (sovrascrive se esiste nei dati di ricerca).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top