2009-12-29 7 views
10

Per qualche motivo sono bloccato su questo. Devo filtrare i risultati da una vista basata su DropDownList nella stessa vista. L'idea di base è questa: ho un elenco di provider che appartengono a vari partner, ma l'elenco dei provider contiene TUTTI i provider insieme (per tutti i partner). Devo essere in grado di visualizzare i fornitori per partner quando qualcuno vuole vedere solo quel partner (altrimenti, l'elenco predefinito sarà TUTTI i provider). La mia vista al momento è il "default" (che mostra tutto), ma per qualche motivo sono seduto qui a fissare il monitor (per le ultime 2 ore!) Cercando di capire come filtrare questi risultati.ASP.NET MVC Il filtraggio produce un elenco/griglia

Qualche suggerimento da dove cominciare/come farlo ?!

risposta

10

EDIT: Se si vuole fare questo con jQuery e AJAX (che fornirà una migliore esperienza utente, perché solo l'elenco suddivisioni si aggiorna), vedi this tutorial.

Se ho capito bene, in pratica vuoi fare un postback in stile WebForms.

Supponiamo di avere un controllo con le suddivisioni di paesi e paesi (ad esempio stati, province, ecc.). Quando il paese cambia, si desidera visualizzare le suddivisioni appropriate.

Quindi questo sarebbe vista:

<% using (Html.BeginForm()) { %> 
    <%=Html.DropDownList("Address.CountryId", new SelectList(Country.GetAll(), "Id", "Name"), new { onchange = "this.form.submit();" })%> 
    <%=Html.DropDownList("Address.CountrySubdivisionId", new SelectList(CountrySubDivision.GetByCountryId(Model.CountryId), "Id", "Name"))%> 
    <input type="submit" name="btnSubmit" value="Submit"/> 
<%} %> 

Questa è la chiave per ottenere la lista dipendente per filtrare:

new { onchange = "this.form.submit();" } 

E nel controller, avresti qualcosa di simile:

[AcceptVerbs(HttpVerbs.Post)] 
    public ViewResult Index(string btnSubmit) 
    { 
     if (btnSubmit == null) 
     { 
      // return the view displayed upon GET 
     } 
     else 
     { 
      // process the submitted data 
     } 
    } 

Nel codice precedente, se l'invio del modulo è stato attivato modificando il valore in un menu a discesa, btnSubm sarà nullo. Quindi, l'azione che stai scrivendo può dire se l'utente ha intenzione di finalizzare le sue modifiche.

+0

Risposta stupenda. Grazie! – SlackerCoder

+0

Sei il benvenuto. Questo è stato fondamentale per me anche da quando ho cercato di mostrare ai miei colleghi che MVC può fare tutto il necessario. –

+2

Sembra che il collegamento del tutorial sia stato interrotto ... – SteveC

3

Ci sono molti modi per scuoiare questo gatto. Eccone uno

Racchiudere DropDownList in un modulo con METHOD = GET.

<form action="" method="get"> 
    <select name="provider"> 
    <option>1</option> 
    <!-- etc --> 
    </select> 
</form> 

Poi, in te controllore, il filtro in base al valore del fornitore che è stato passato in. Ricordate di trattarlo come un parametro Null in modo da poter avere un qualche tipo di comportamento quando è vuota.

Senza pubblicare parte del codice corrente, è difficile ottenere molto più specifico di quello.

+1

+1 per un semplice esempio di codice. –

1

Supponiamo che stiate passando un modello alla vista e che il modello sia un elenco o IEnummerable di partner. Quello che vuoi fare è limitare la lista. Per fare ciò aggiungere un elenco a discesa nella vista e riempirlo con alcuni possibili partner. Questo può essere fatto inserendo un elenco in ViewData o espandendo il modello restituito alla vista. Entrambi hanno vantaggi. Ora quando cambi il menu a tendina ricarichi la pagina ma aggiungi un parametro che è il filtro. Nel controller, verificare se quel parametro è nell'azione, se non è presente, restituire un elenco non filtrato, se è quindi applicare un filtro e restituire l'elenco. La vista mostrerà semplicemente qualsiasi cosa tu gli dai.

Per quanto riguarda il filtro, è possibile provare a utilizzare LINQ.

0

Probabilmente vuoi un parametro per l'azione del tuo controller, magari un id (nullable?) Del provider, per filtrare i risultati già quando li ricevi dal DB. Quindi usa la stessa vista per elencarli e richiedi un nuovo elenco se il dropdownlist cambia.

6

Per aggiungere le risposte precedenti.

Per creare un menu a discesa (in ASP .NET MVC 3) ho fatto il seguente: codice di

Aggiunga al Index.cshtml

@using (Html.BeginForm()) 
{  
@Html.DropDownList("EmployeeId", (SelectList)ViewData["EmployeeId"])  
<input type="submit" name="btnSubmit" value="Submit"/> 
} 

Aggiungere il codice per YourModelNameController.cs nel ActionResult predefinito per Index()

public ActionResult Index() 
{ 

    //create a selectlist 
     var employeeList = from el in db.Employee select el; 
     ViewData["EmployeeId"] = new SelectList(employeeList, "EmployeeId", "TmName"); 

     return View(modelName); 
    } 
+1

+1 Stavo cercando una risposta specifica per il rasoio! Grazie! –