Html helper para

¿Hay un HTMLHelper para subir archivos? Específicamente, estoy buscando un reemplazo de

  

utilizando ASP.NET MVC HTMLHelper.

O, si uso

 using (Html.BeginForm()) 

¿Cuál es el control de HTML para la carga del archivo?

Archivo de carga HTML ASP MVC 3.

Modelo : ( Tenga en cuenta que FileExtensionsAttribute está disponible en MvcFutures. Validará las extensiones de archivo del lado del cliente y del servidor ) .

 public class ViewModel { [Required, Microsoft.Web.Mvc.FileExtensions(Extensions = "csv", ErrorMessage = "Specify a CSV file. (Comma-separated values)")] public HttpPostedFileBase File { get; set; } } 

Vista de HTML :

 @using (Html.BeginForm("Action", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.TextBoxFor(m => m.File, new { type = "file" }) @Html.ValidationMessageFor(m => m.File) } 

Acción del controlador :

 [HttpPost] public ActionResult Action(ViewModel model) { if (ModelState.IsValid) { // Use your file here using (MemoryStream memoryStream = new MemoryStream()) { model.File.InputStream.CopyTo(memoryStream); } } } 

También puedes usar:

 @using (Html.BeginForm("Upload", "File", FormMethod.Post, new { enctype = "multipart/form-data" })) { 

}

Hace un tiempo tuve la misma pregunta y encontré una de las publicaciones de Scott Hanselman:

Implementación de carga de archivos HTTP con ASP.NET MVC, incluidas pruebas y simulacros

Espero que esto ayude.

Versión mejorada de la respuesta de Paulius Zaliaduonis:

Para que la validación funcionara correctamente, tuve que cambiar el Modelo a:

 public class ViewModel { public HttpPostedFileBase File { get; set; } [Required(ErrorMessage="A header image is required"), FileExtensions(ErrorMessage = "Please upload an image file.")] public string FileName { get { if (File != null) return File.FileName; else return String.Empty; } } } 

y la vista para:

 @using (Html.BeginForm("Action", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.TextBoxFor(m => m.File, new { type = "file" }) @Html.ValidationMessageFor(m => m.FileName) } 

Esto es necesario porque lo que @Serj Sagan escribió sobre el atributo FileExtension solo funciona con cadenas.

O podrías hacerlo correctamente:

En su clase de extensión HtmlHelper:

 public static MvcHtmlString FileFor(this HtmlHelper helper, Expression> expression) { return helper.FileFor(expression, null); } public static MvcHtmlString FileFor(this HtmlHelper helper, Expression> expression, object htmlAttributes) { var builder = new TagBuilder("input"); var id = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression)); builder.GenerateId(id); builder.MergeAttribute("name", id); builder.MergeAttribute("type", "file"); builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); // Render tag return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing)); } 

Esta línea:

 var id = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression)); 

Genera una identificación única para el modelo, usted sabe en listas y demás. modelo [0] .Nombre, etc.

Crea la propiedad correcta en el modelo:

 public HttpPostedFileBase NewFile { get; set; } 

Luego debe asegurarse de que su formulario envíe archivos:

 @using (Html.BeginForm("Action", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" })) 

Entonces aquí está tu ayudante:

 @Html.FileFor(x => x.NewFile) 

Para usar BeginForm , esta es la manera de usarlo:

  using(Html.BeginForm("uploadfiles", "home", FormMethod.POST, new Dictionary(){{"type", "file"}}) 

Esto también funciona:

Modelo:

 public class ViewModel { public HttpPostedFileBase File{ get; set; } } 

Ver:

 @using (Html.BeginForm("Action", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.TextBoxFor(m => m.File, new { type = "file" }) } 

Acción del controlador:

 [HttpPost] public ActionResult Action(ViewModel model) { if (ModelState.IsValid) { var postedFile = Request.Files["File"]; // now you can get and validate the file type: var isFileSupported= IsFileSupported(postedFile); } } public bool IsFileSupported(HttpPostedFileBase file) { var isSupported = false; switch (file.ContentType) { case ("image/gif"): isSupported = true; break; case ("image/jpeg"): isSupported = true; break; case ("image/png"): isSupported = true; break; case ("audio/mp3"): isSupported = true; break; case ("audio/wav"): isSupported = true; break; } return isSupported; } 

Lista de tipos de contenido

Creo que es un poco hacky, pero da como resultado la correcta aplicación de los atributos de validación, etc.

 @Html.Raw(Html.TextBoxFor(m => m.File).ToHtmlString().Replace("type=\"text\"", "type=\"file\""))