290 messaggi dal 08 luglio 2008
Ciao a tutti,

vorrei capire, arrivando dal mondo webform, come posso in mvc leggere in post i campi input presenti in partial view create a runtime.

Faccio un esempio (spero di riuscire a farmi capire)

La mia view principale ha all'interno una partial view (A), che è incaricata a sua volta di stampare al suo interno N partial view (B) contenenti input text.
Nel caso specifico, la prima partial view (A) stampa tante partial view (B) al suo interno quante sono le lingue presenti nel sito (gestite dinamicamente) e ogni partial view (B) ha al suo interno 3 campi text (titolo, sottotitolo, oggetto)

Nel momento in cui l'utente invia il form, lato post come faccio ad intercettare i campi di input presenti nelle partial view (B) aggiunte a runtime?

Vi ringrazio

:)
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
innanzitutto è importante che le 3 caselle titolo, sottotitolo e oggetto delle varie lingue abbiano attributi name diversi, in modo che sia poi possibile distinguerli. Io predisporrei anche un quarto campo hidden in cui mettere il nome (o la sigla) della lingua a cui i 3 campi appartengono.


come faccio ad intercettare i campi di input presenti nelle partial view (B)

Non ha molta importanza come sia stato generato l'html, se con partial o lato client con del javascript.
Lato server, quando ASP.NET MVC riceve il form, ciò che vede solo solo le coppie chiave-valore inviate col form. Dato che non si tratta di WebForms, non esistono "controlli server" il cui stato viene ripristinato dopo un post. Ed ecco spiegata l'importanza di valorizzare gli attributi name in maniera univoca perché essi saranno usati come chiavi all'invio del form.

Leggi questa discussione, ti dà uno spunto per valorizzare l'attributo name in modo che poi il model binder possa ricostruire una lista di oggetti.
http://forum.aspitalia.com/forum/post/403972/Inserire-Lista-Proprieta-Model-Interno-Form.aspx

Supponiamo che le tue caselle vengano generate così:
<h2>Italiano</h2>
<input type="hidden" name="[0].Lingua" value="it" />
<div><input type="text" name="[0].Titolo" value="" /></div>
<div><input type="text" name="[0].Sottotitolo" value="" /></div>
<div><input type="text" name="[0].Oggetto" value="" /></div>

<h2>Inglese</h2>
<input type="hidden" name="[1].Lingua" value="en" />
<div><input type="text" name="[1].Titolo" value="" /></div>
<div><input type="text" name="[1].Sottotitolo" value="" /></div>
<div><input type="text" name="[1].Oggetto" value="" /></div>

Come vedi, i name sono differenziati dalla presenza di un indice che servirà al modelbinder per capire che quelli sono elementi di una lista.

Lato server potrai recuperare quei valori in maniera strutturata in questo modo:
[HttpPost]
public async Task<ActionResult> Aggiorna(List<Contenuto> contenuti) {
  //qui leggi contenuti
}

Dove Contenuto sarà un tipo di oggetto creato da te, in cui hai messo le proprietà Titolo, Sottotitolo, Oggetto e Lingua.
public class Contenuto {
  public string Titolo {get;set;}
  public string Sottotitolo {get;set;}
  public string Oggetto {get;set;}
  public string Lingua {get;set;}
}


ciao,
Moreno

Enjoy learning and just keep making
1.492 messaggi dal 27 dicembre 2005
Non sapevo si potesse far cosi [0].Lingua.

Ero abituato a dare lo stesso name e lui creava la matrice da solo.

Ovviamente le propietà del name devono essere univoche altrimenti non riesce a ricreare l'oggetto.
11.886 messaggi dal 09 febbraio 2002
Contributi
In questo caso preferisco fare così perché almeno mi trovo tutte le proprietà correlate fra loro in un unico oggetto (Contenuto) anziché in 4 array separati. Così sono anche libero di persistere quell'oggetto così com'è.

ciao,
Moreno
Modificato da BrightSoul il 31 ottobre 2016 19.30 -

Enjoy learning and just keep making
1.492 messaggi dal 27 dicembre 2005
Però l'indice dell array lo scelgo io ?
Nel senso posso iniziare con indice 1 o magari saltare e mettere 0 poi 2 poi 5 ecc ?
290 messaggi dal 08 luglio 2008
Ciao BrightSoul , grazie mille per l'esaustiva spiegazione.

Farò alcune prove e ti farò sapere.

:)

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.