mvc htmlattributes for example ejemplo c# asp.net-mvc asp.net-mvc-2 editorfor

c# - for - htmlattributes mvc



¿Se puede usar EditorFor() para crear<input type=“file”>? (4)

Dado este modelo, ¿es posible usar Html.EditorFor () para representar un elemento de entrada de carga de archivos en la página? Jugué un poco con el tipo de datos de la propiedad FileName, y definitivamente tuvo un impacto en la forma del editor renderizado.

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

Strongly Typed * .aspx la página se ve así

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


Agregue: 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.


Aquí hay un ejemplo para MVC 5 (requerido para los atributos html).

Cree 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 id y el nombre correctos y funciona al editar colecciones desde una plantilla EditorFor modelo.



Tendría más sentido utilizar HttpPostedFileBase para representar un archivo cargado en su modelo de vista en lugar de una 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 podrías tener la siguiente 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, defina la plantilla de editor correspondiente dentro de ~/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 verse así:

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"); } }