¿Cómo mantener el tipo de entrada = valor de campo de archivo después de la validación fallida en ASP.NET MVC?

Tengo un formulario simple en una aplicación MVC que he creado. Contiene un campo de archivo para que los usuarios puedan subir una imagen. Todo funciona genial

El problema es que si el envío del formulario no es validado, el contenido del campo del archivo se pierde (¡otros campos permanecen llenos, thx HtmlHelpers!). ¿Cómo puedo mantener el campo de archivo poblado después de una validación fallida?

TIA!

Los navegadores están diseñados de esa manera debido a los riesgos de seguridad. Es imposible establecer el valor del cuadro de entrada de archivo en fuente HTML o por Javascript. De lo contrario, las secuencias de comandos maliciosas podrían robar algunos archivos privados sin la atención del usuario.

Hay una información interesante sobre el tema.

Por lo que sé, no puede establecer el valor de un cuadro de entrada de archivo HTML. Sugiero acoplar el cuadro de entrada de archivo con una etiqueta o cuadro de texto.

Luego puede llenarlo con el valor del cuadro de entrada de archivo para volver a enviarlo más tarde.

Hay cargadores de archivos basados ​​en flash. Prueba uno de ellos. Algunos de ellos incluso vuelven al cuadro de entrada de archivo normal si el flash y el script java no son compatibles. Aconsejo buscar plugins jQuery.

Si el archivo no es demasiado grande, puede basarlo64 y usarlo como valor para un campo oculto.

No puede establecer el valor de un cuadro de entrada de archivo HTML. Como solución alternativa, reemplace el cuadro de carga de archivos con un campo de entrada oculto al generar el formulario después de la validación.

Al enviarlo, rellena el campo oculto con el valor del cuadro de entrada del archivo (para volver a enviarlo más tarde). Recuerde tener la carga del archivo o el nombre del campo oculto presente en cualquier momento (no ambos):

Nota: El siguiente código es solo para fines ilustrativos / explicativos . Reemplácelo con el código apropiado para el idioma que usa.

     

Recomiendo hacer la validación de antemano a través de ajax y hacer una actualización parcial de la página. En este caso, no perderá el archivo.

No estoy de acuerdo con que se marque “imposible” como respuesta correcta. En caso de que alguien todavía esté buscando una posibilidad, aquí está el trabajo que funcionó para mí. Estoy usando MVC5. La idea es usar una variable de sesión. Obtuve la idea del formulario ASP.Net .

Mi modelo / ViewModel (solo propiedades relevantes):

 public partial class emp_leaves { public string fileNameOrig { get; set; } public byte[] fileContent { get; set; } public HttpPostedFileBase uploadFile { get; set; } } 

En mi controlador (HttpPost): // Check

 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(emp_leaves emp_leaves) { if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName)) { emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName); emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength]; emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength); Session["emp_leaves.uploadFile"] = emp_leaves.uploadFile; //saving the file in session variable here } else if (Session["emp_leaves.uploadFile"] != null) {//if re-submitting after a failed validation you will reach here. emp_leaves.uploadFile = (HttpPostedFileBase)Session["emp_leaves.uploadFile"]; if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName)) { emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName); emp_leaves.uploadFile.InputStream.Position = 0; emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength]; emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength); } } //code to save follows here... } 

Finalmente en mi vista de edición: aquí, estoy mostrando condicionalmente el control de carga de archivos.

 < script type = "text/javascript" > $("#removefile").on("click", function(e) { if (!confirm('Delete File?')) { e.preventDefault(); return false; } $('#fileNameOrig').val(''); //toggle visibility for concerned div $('#downloadlrfdiv').hide(); $('#uploadlrfdiv').show(); return false; }); < /script> 
  @model PPMSWEB.Models.emp_leaves @{ HttpPostedFileBase uploadFileSession = Session["emp_leaves.uploadFile"] == null ? null : (HttpPostedFileBase)Session["emp_leaves.uploadFile"]; } @using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.AntiForgeryToken() 
@*irrelevant content removed*@
@Model.fileNameOrig @if (isEditable && !Model.readonlyMode) { @Html.Raw("&nbsp"); }
@Html.TextBoxFor(model => model.uploadFile, new { @type = "file", @class = "btn btn-default", @title = "Upload file (max 300 KB)" }) @Html.ValidationMessageFor(x => x.uploadFile)
}