2011-05-24 22 views
21

Dado este modelo, ¿es posible usar el Html.EditorFor() para representar un elemento de entrada de carga de archivos en la página? Jugué con el tipo de datos de la propiedad NombreDeArchivo, y definitivamente estaba impactando el formulario de editor renderizado.¿Puede EditorFor() usarse para crear <input type = "file">?

public class DR405Model 
{ 
    [DataType(DataType.Text)] 
    public String TaxPayerId { get; set; } 
    [DataType(DataType.Text)] 
    public String ReturnYear { get; set; } 

    public String FileName { get; set; } 
} 

fuertemente tipado * .aspx página se parece a esto

<div class="editor-field"> 
     <%: Html.EditorFor(model => model.FileName) %> 
     <%: Html.ValidationMessageFor(model => model.FileName) %> 
    </div> 
+4

MVC4 - Me he estado preguntando por qué DataType.Upload no representa tipo = "archivo" – felickz

Respuesta

35

Tendría más sentido utilizar HttpPostedFileBase para representar un archivo cargado en su vista modelo en vez de string:

public class DR405Model 
{ 
    [DataType(DataType.Text)] 
    public string TaxPayerId { get; set; } 

    [DataType(DataType.Text)] 
    public string ReturnYear { get; set; } 

    public HttpPostedFileBase File { get; set; } 
} 

entonces usted podría tener el siguiente punto de vista:

<% using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) { %> 

    ... input fields for other view model properties 

    <div class="editor-field"> 
     <%= Html.EditorFor(model => model.File) %> 
     <%= Html.ValidationMessageFor(model => model.File) %> 
    </div> 

    <input type="submit" value="OK" /> 
<% } %> 

Y finalmente definir la plantilla correspondiente editor de interior ~/Views/Shared/EditorTemplates/HttpPostedFileBase.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<input type="file" name="<%: ViewData.TemplateInfo.GetFullHtmlFieldName("") %>" id="<%: ViewData.TemplateInfo.GetFullHtmlFieldId("") %>" /> 

Ahora el controlador podría tener este aspecto:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new DR405Model()); 
    } 

    [HttpPost] 
    public ActionResult Index(DR405Model model) 
    { 
     if (model.File != null && model.File.ContentLength > 0) 
     { 
      var fileName = Path.GetFileName(model.File.FileName); 
      var path = Path.Combine(Server.MapPath("~/App_Data"), fileName); 
      model.File.SaveAs(path); 
     } 

     return RedirectToAction("Index"); 
    } 
} 
+0

Gracias esa es la respuesta que estaba buscando. –

+8

También podría usar '@ Html.TextBoxFor (x => x.File, new {type =" file "})' –

+0

@Darin -Lo que será el tipo de datos si guardo la URL del archivo en una base de datos. En Model tiene - "HttpPostedFileBase" –

0
+0

Ya se ha creado. Tal vez estoy yendo en la dirección equivocada. Tengo datos de perfil de aspnet_db, que tendré que casarme con el archivo cargado. Entonces, el archivo de los usuarios se guarda en el servidor con 'user_id' +' date' + '" xlsx "' Estaba pensando que necesitaba crear un modelo, que tuviera propiedades más allá del objeto de archivo solo. –

5

He aquí una ejemplo para MVC 5 (requerido para los atributos html).

Crear esto como un archivo llamado HttpPostedFileBase.cshtml en ~ \ Views \ Shared \ EditorTemplates

@model HttpPostedFileBase 
@{ 
    var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]); 
    htmlAttributes["type"] = "file"; 
} 
@Html.TextBoxFor(model => model, htmlAttributes) 

Esto genera el control con el identificador y el nombre correcto y funciona durante la edición de colecciones de una plantilla EditorFor modelo.

+0

Parece importante observar aquí que puede haber más cosas detrás de escena. Lo anterior no funcionaría hasta que se cambiara una configuración en las propiedades del archivo .cshtml: Acción de compilación, Ninguno -> Contenido. Por una respuesta a esta pregunta: [link] (http://stackoverflow.com/questions/6782769/why-is-my-editor-template-ignored-when-i-call-editorformodel) – GG2

+0

Un par de puntos, la construcción La acción de .cshtnl es Contenido de manera predeterminada y la respuesta a la que se refiere es de 2011 y habla sobre MVC 3 - MVC 5 No tuve que hacer ningún cambio para que esto funcione –

+0

Funciona como brisa. No se requiere cambio adicional aparte de la plantilla del editor – Nitin

3

Añadir: htmlAttributes = new {type = "file"}

<div class="editor-field"> 
    <%: Html.EditorFor(model => model.FileName, new { htmlAttributes = new { type = "file" }) %> 
    <%: Html.ValidationMessageFor(model => model.FileName) %> 
</div> 

Nota: Estoy usando MVC 5, no he probado en otras versiones.

Cuestiones relacionadas