Como experimentado desarrollador de ASP.Net que recientemente comencé a utilizar MVC, me cuesta un poco cambiar mi forma de pensar de un controlador de eventos y controlador de servidor tradicional. forma de hacer las cosas, en la forma de cosas MVC más dinámica. Creo que estoy llegando poco a poco, pero a veces la "magia" de MVC me saca de quicio.ASP.Net MVC y estado: cómo mantener el estado entre las solicitudes
Mi situación actual es crear una página web que permita al usuario buscar un archivo local, cargarlo en el servidor y repetirlo hasta que tenga una lista de archivos para trabajar. Cuando esté contento con la lista de archivos (que se mostrará en una cuadrícula en la página), hará clic en un botón para procesar los archivos y extraer algunos datos que se almacenarán en una base de datos.
La última parte no es tan importante, en este momento estoy luchando con algo tan trivial como crear una lista de archivos, y persistir esa lista entre las solicitudes. En el enfoque tradicional, esto sería extremadamente simple: los datos se conservarían en ViewState. Pero en MVC necesito pasar los datos entre el controlador y las vistas, y no entiendo completamente cómo se supone que funciona.
Creo que será mejor que publique mi intento bastante incompleto de codificar esto para explicar el problema.
Con el fin de mantener los datos de la lista de archivos, que han creado un modelo de vista que es básicamente una lista mecanografiada de archivos, junto con algunos metadatos adicionales:
public class ImportDataViewModel
{
public ImportDataViewModel()
{
Files = new List<ImportDataFile>();
}
public List<ImportDataFile> Files { get; set; }
...
En la vista, tengo una forma para la navegación y cargar el archivo:
<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 está utilizando el modelo de vista como modelo:
@model MHP.ViewModels.ImportDataViewModel
Esto enviará el archivo a mi acción:
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);
}
Esta acción devuelve la vista de la página DataImport junto con la instancia de modelo de vista que contiene la lista de archivos.
Esto funciona muy bien hasta cierto punto, puedo buscar un archivo y subirlo, y puedo ver los datos del modelo de vista dentro de la acción, y luego también si pongo un punto de interrupción dentro de la vista y depuro "this.Model ", todo esta bien.
Pero luego, si intento cargar otro archivo, al poner un punto de interrupción dentro de la acción AddImportFile, el parámetro importData está vacío. Entonces la vista obviamente no está pasando la instancia actual de su modelo a la acción.
En los ejemplos de MVC que he visto, la instancia del modelo se transfiere "mágicamente" al método de acción como parámetro, entonces ¿por qué está vacía ahora?
Supongo que el verdadero problema es mi comprensión limitada de MVC, y que probablemente exista una solución muy simple para esto. De todos modos, estaría extremadamente agradecido si alguien pudiera señalarme en la dirección correcta.
No está almacenando los archivos cargados en ningún lugar del servidor. ¿Cómo espera que se persistan entre las devoluciones? Todo lo que tienes dentro de tu '
Darin, gracias por tu comentario. Es correcto que no estoy almacenando el archivo en el servidor. Podría almacenarlo en la base de datos, pero eso sería un desperdicio de espacio en la base de datos y la paciencia del usuario, ya que llevaría mucho tiempo y no es realmente necesario. Lo que me gustaría hacer es simplemente mantenerlo en la memoria del servidor como una variable de alguna manera hasta que el usuario decida procesarlo. Luego almacenaré la salida de ese procesamiento en la base de datos. Creo que o bien estoy tratando de usar MVC de la manera incorrecta, o simplemente no sé cómo hacerlo. Simplemente no sé cuál es todavía ... – TMan
Mantener archivos en la memoria del servidor es una de las peores cosas. Evita esto a cualquier precio. No solo eso consumirá mucha memoria en su servidor, pero no olvide que IIS podría reciclar el dominio de la aplicación en cualquier momento, perdiendo todos los datos almacenados en la memoria. ¿Qué sucede si se ejecuta en una granja de servidores?Si almacena en la memoria del servidor, esto significa que solo 1 servidor de la granja tiene esta información y si el equilibrador de carga envía las solicitudes subsiguientes a otro servidor de la granja de servidores, perderá la información. –