2012-03-09 17 views
7

In uno dei moduli su cui sto lavorando, se l'utente seleziona DropDownList "Tipo", in base al valore selezionato, mostrerò dinamicamente un insieme di altri DropDownList.Registrazione di moduli dinamici in ASP.NET MVC 3

Per esempio, tipi: auto, appartamento Selezione "Car", avrebbe dinamicamente aggiungere due nuovi DropDownList "Prezzo" & "modello". Selezionando "Edificio", aggiungerei dinamicamente due nuove DropDownList "Area" & "Piano"

La mia domanda è come gestire i dati inviati al server? In genere ricevo i campi del modulo e ottengono automaticamente il "modello vincolato". Ma che dire di quei campi dinamici che sono stati aggiunti sulla pagina in base alla selezione dell'utente? Come li recupererò all'interno dell'azione?

Grazie

+0

Hai provato a usare Ajax –

+0

@COLDTOLD questo è un problema sul lato server, Ajax non è una soluzione che avrebbe alcun impatto –

+0

@Marek Karbarz è possibile aggiornare una parte parziale della pagina aggiungendo nuovi elementi con l'Ajax –

risposta

2

Ah frainteso questo.

Se sai cosa è possibile aggiungere Dropdowns, vorrei sempre avere un valore sul tuo modello. MVC li imposterà come valore predefinito se non viene ricevuto nulla.

EDIT: è ancora possibile accedere alla raccolta moduli in un modo più crudo dai controller withing utilizzando

Request.Form.Keys 
Request.QueryString.Keys 

Request["ExpectedDropdownName"] 

Naturalmente questi saranno tutti i valori inviati dal form in modo avrete bisogno di un modo per riconoscere uno dei i tuoi menu a discesa come un prefisso o qualcosa del genere. Per esempio

foreach (var key in Request.Form.AllKeys.Where(k => k.StartsWith("dynamic-dropdown-")) 
    { 
     var selectedValue = Request[key]; 
    } 

io ancora non capisco come si intende elaborare menu di scorrimento dinamici se non sai che cosa saranno e questo può causare alcuni problemi e farò convalida interamente dinamico e lato client (non sicuro al 100%). Ciò potrebbe presentare anche alcuni problemi di sicurezza, ma ci sono alcuni sceanari in cui potresti usare questo e presumo che tu ne abbia uno.

Se questo non è il caso, non dimenticare che solo perché un Modello ha una proprietà, non deve essere posticipato affatto.

Si potrebbe fare:

public class MyModel 
{ 
    [Required] 
    public string FirstName { get; set; } 

    public string PossibleDropdown1 { get; set; } 

    public string PossibleDropdown2 { get; set; } 
} 

Il controller farà la cosa migliore per popolare il modello, ma se non si passa alcuni campi indietro dal modulo, che sarà solo nullo e l'azione sarà ancora lavoro.

Ho anche implementato scenari molto più complessi come questo utilizzando oggetti che sono figli del modello principale e tutti i valori nulli. Ciò richiede un po 'di lavoro elaborato intorno alle chiamate ajax a EditorTemplates in Mock Views per garantire che il prefisso sia corretto per l'analisi di MVC, ma qui non lo analizzerò.

+0

Il problema è , i DropDown sono dinamici e non c'è modo di sapere in anticipo quali DropDowns verrebbero visualizzati! Una domanda però, nel caso in cui imposto come input per l'Action a ViewModel senza DropDowns, c'è un modo per accedere a FormsCollection all'interno del corpo del metodo Action? – Bill

8

È possibile utilizzare la FormCollection per accedere a tutti i campi della pagina. Tuttavia si perde il modello automatico vincolante e dovrà scorrere l'insieme modulo per trovare i tuoi valori come segue:

public ActionResult ActionMethod(FormCollection formCollection) 
{ 
    foreach (var key in formCollection.AllKeys) 
    { 
     var value = formCollection[key]; 
    } 
} 

Naturalmente si potrebbe anche solo comprendere menu di scorrimento dinamici nel modello.