Come sviluppatore di ASP.Net abbastanza esperto che ha appena iniziato a utilizzare MVC, mi trovo a dover lottare un po 'per cambiare la mia mentalità da un tradizionale "controllo server ed event handler" modo di fare le cose, nel modo più dinamico di cose MVC. Penso che sto lentamente arrivando, ma a volte la MVC "magica" mi butta via.ASP.Net MVC e stato - come mantenere lo stato tra le richieste
Il mio attuale scenario è quello di creare una pagina web che permetta all'utente di cercare un file locale, caricarlo sul server e ripeterlo fino a quando non ha una lista di file con cui lavorare. Quando è contento dell'elenco file (che verrà visualizzato in una griglia sulla pagina), farà clic su un pulsante per elaborare i file ed estrarre alcuni dati che verranno archiviati in un database.
L'ultima parte non è così importante, in questo momento sono alle prese con qualcosa di così banale come creare un elenco di file e persistere nell'elenco tra le richieste. Nell'approccio tradizionale ciò sarebbe estremamente semplice: i dati verrebbero mantenuti in ViewState. Ma in MVC ho bisogno di passare i dati tra il controller e le viste e non capisco appieno come funzioni.
Credo di pubblicare meglio il mio tentativo, piuttosto incompleto, di codificarlo per spiegare il problema.
Al fine di mantenere i miei dati della lista di file, ho creato un ViewModel che è fondamentalmente un elenco dattiloscritto di file, insieme ad alcuni metadati in più:
public class ImportDataViewModel
{
public ImportDataViewModel()
{
Files = new List<ImportDataFile>();
}
public List<ImportDataFile> Files { get; set; }
...
Nella vista, ho un modulo per la navigazione e caricare il file:
<form action="AddImportFile" method="post" enctype="multipart/form-data">
<label for="file">
Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" />
</form>
la vista sta usando il ViewModel come il suo modello:
@model MHP.ViewModels.ImportDataViewModel
Questo invierà il file per la mia azione:
public ActionResult AddImportFile(HttpPostedFileBase file, ImportDataViewModel importData)
{
if (file.ContentLength > 0)
{
ImportDataFile idFile = new ImportDataFile { File = file };
importData.Files.Add(idFile);
}
return View("DataImport", importData);
}
Questa azione restituisce la vista per la pagina dataimport insieme con l'istanza ViewModel che contiene l'elenco dei file.
Questo funziona bene fino a un certo punto, posso sfogliare un file e caricarlo, e posso vedere i dati viewmodel all'interno dell'azione, e poi anche se metto un punto di interruzione all'interno della vista e debug "this.Model ", va tutto bene.
Tuttavia, se provo a caricare un altro file, quando si inserisce un punto di interruzione all'interno dell'azione AddImportFile, il parametro importData è vuoto. Quindi la vista ovviamente non passa l'istanza attuale del suo modello all'azione.
Negli esempi MVC che ho attraversato, l'istanza del modello è passata "magicamente" al metodo action come parametro, quindi perché è vuota ora?
Suppongo che il vero problema sia la mia comprensione limitata di MVC e che probabilmente c'è una soluzione molto semplice a questo. Ad ogni modo, sarei estremamente grato se qualcuno potesse indicarmi la giusta direzione.
Non si memorizzano i file caricati da nessuna parte sul server. Come ti aspetti che vengano mantenuti tra i postback? Tutto ciò che hai dentro il tuo '
Darin, grazie per il tuo commento. È corretto che non stia memorizzando il file sul server. Potrei memorizzarlo nel database, ma quello sarebbe uno spreco di spazio del database e la pazienza dell'utente, in quanto richiederebbe molto tempo e non è necessario. Quello che vorrei fare è solo di tenerlo in qualche modo nella memoria del server come variabile finché l'utente non decide di elaborarlo. Quindi memorizzerò l'output di tale elaborazione nel database. Penso che sto cercando di usare MVC nel modo sbagliato, o semplicemente non so come farlo. Non so ancora quale sia ... – TMan
Tenere i file nella memoria del server è una delle cose peggiori. Evita questo a tutti i costi. Non solo questo consumerà molta memoria sul tuo server ma non dimenticherai che IIS potrebbe riciclare il dominio dell'applicazione in qualsiasi momento, perdendo tutti i dati archiviati in memoria. Inoltre, cosa succede se si esegue una server farm?Se si archivia nella memoria del server, ciò significa che solo 1 server della farm dispone di queste informazioni e se il bilanciamento del carico invia richieste successive su un altro server della farm, si perderanno le informazioni. –