Given this model, is it possible to use the Html.EditorFor() to render a file upload input element to the page? I played around with the Datatype of the property FileName,
Add: htmlAttributes = new { type = "file" }
<div class="editor-field">
<%: Html.EditorFor(model => model.FileName, new { htmlAttributes = new { type = "file" }}) %>
<%: Html.ValidationMessageFor(model => model.FileName) %>
</div>
Note: I'm using MVC 5, I have not tested on other versions.
Here's an example for MVC 5 (required for the htmlAttributes).
Create this as a file called HttpPostedFileBase.cshtml under ~\Views\Shared\EditorTemplates
@model HttpPostedFileBase
@{
var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
htmlAttributes["type"] = "file";
}
@Html.TextBoxFor(model => model, htmlAttributes)
This generates the control with the correct id and name and works when editing collections from a model EditorFor template.
It would make more sense to use HttpPostedFileBase to represent an uploaded file on your view model instead of 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; }
}
then you could have the following view:
<% 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" />
<% } %>
And finally define the corresponding editor template inside ~/Views/Shared/EditorTemplates/HttpPostedFileBase.ascx
:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<input type="file" name="<%: ViewData.TemplateInfo.GetFullHtmlFieldName("") %>" id="<%: ViewData.TemplateInfo.GetFullHtmlFieldId("") %>" />
Now the controller might look like this:
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");
}
}
No but take a look at http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx