2009-01-13 3 views
8

Ho un modulo che consente all'utente di creare "righe" extra usando JQuery (usando .clone) in modo che possano decidere quante delle stesse informazioni di cui hanno bisogno di inviare. Il mio problema è che non riesco a capire come accedere a questi elementi del modulo all'interno del mio controller.Invio di elementi del modulo con lo stesso nome

forma che viene presentata può apparire come questo

<input type="text" name="Amount" id="Amount"> 
    <select name="Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 
<input type="text" name="Amount" id="Amount"> 
    <select name="Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 
<input type="text" name="Amount" id="Amount"> 
    <select name="Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 

Fondamentalmente, il blocco tra input e selezionare potrebbe essere ripetuta infinite volte. Quando invio al controller, utilizzo quindi FormCollection form per accedere agli elementi del modulo. da lì non sono sicuro di come posso accedere agli articoli che sono stati inviati. Ho pensato di utilizzare un ciclo for e quindi di accedervi tramite qualcosa come forma ["Amount"] [i] ma ovviamente non funzionerà.

Sto andando su questo nel modo giusto e se sì, qualcuno ha qualche suggerimento su come questo potrebbe funzionare?

Grazie in anticipo.

+0

Mai e poi mai creare elementi con lo stesso attributo 'id =" ... "'. Il concetto di 'id' deve essere unico. –

risposta

1

ho finito per rendersi conto che (blush) il meccanismo utilizzato da JQuery per trovare la stringa all'interno del clone d row (to replace) è fondamentalmente regex. Quindi ho solo dovuto sfuggire alle parentesi quadre e al punto. Una volta fatto questo, ho potuto usare JQuery per creare la forma suggerita dal blog di Phil Haack.

Sul mio prossimo numero ...!

4

Credo che se ci sono più campi di nome Quantità i valori saranno delimitati da virgole.

Per accedere ognuno basta provare:

string[] amounts = Request.Form["Amount"].Split(new char[] { ',' }); 

Occorre tuttavia tenere presente, gli ingressi non vengono puliti su presentazione, quindi se qualcuno entra una virgola nella casella di testo sta andando a causare problemi.

Quindi mi consiglia di numerarli.

+0

Questo è corretto, è solo l'accesso a loro che sto avendo difficoltà con. – dave

+0

Ah si puoi usare il metodo split. –

+0

Ok, quindi forse sto guardando all'area sbagliata e ho bisogno di scoprire come modificare gli attributi dei moduli clonati che includono [] caratteri! – dave

0

avrei numerarli amount1, AMOUNT2, amount3 ecc

+0

Il problema è che JQuery non sembra voler rinominare un attributo del modulo clonato quando include [] caratteri. L'elemento del modulo esistente viene clonato ma l'ID e il nome degli attributi non vengono modificati. Altrimenti userei questa http://haacked.com/archive/0001/01/01/model-binding-to-a-list.aspx tecnica. – dave

0

È possibile modificare l'attributo id e il nome del input per una cosa del genere "Importo [1]", "Importo [2]", "Importo [3] "(sì, l'attributo id e name può contenere i caratteri speciali" ["o"] "). Quindi, nel controller, scrivere un parser dei parametri di richiesta http per recuperare gli importi come raccolte.

+0

Grazie a jscoot, come il commento lasciato per la risposta di Adam. – dave

6

Check out Model Binding To A List. Il tuo metodo Action dovrebbe essere:

public ActionResult MyAction(string[] Amount, int[] Item){ 
    // ... 
} 

Tuttavia questo ti renderà necessario "collegare" gli articoli. In alternativa, creare una "voce" di classe:

public class Item { 
    public string Amount { get; set; } 
    public int Item { get; set; } 
} 

E

public ActionResult MyAction(IList<Item> items){ 
    // ... 
} 

E il vostro codice dovrebbe essere:

<input type="hidden" name="items.Index" value="0" /> 
<input type="text" name="items[0].Amount" id="items[0].Amount"> 
    <select name="items[0].Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 
<input type="hidden" name="items.Index" value="1" /> 
<input type="text" name="items[1].Amount" id="items[1].Amount"> 
    <select name="items[1].Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 

Etc ...

+0

Grazie per la risposta, ho effettivamente fatto un commento su come farlo nella risposta di Spencer. Giungeva a JQuery non piacendo [] nei campi id identificativo e nome così quando sono andato a cambiarli, JQuery non l'avrebbe fatto. Forse dovrei postare su JQuery in quanto è un modo più bello per farlo. – dave

12

Vecchia domanda, ma ancora ... È possibile ottenere i valori registrati come array chiamando Request.Form.GetValues o Request.QueryString.GetValues. Per esempio:

string[] amounts = Request.Form.GetValues("Amount"); 

e l'array amounts conterrà i valori corretti, in modo da poter inserire i valori contenenti Comas, puntini, qualunque sia, e non preoccuparti di scissione/analizzarlo.

Naturalmente se si esegue MVC, utilizzare il modelbinder per farlo. Ma puoi usare questo se stai usando webform, un gestore generico, ecc ...