Can EditorFor() be used to create <input type=“file”>?

前端 未结 4 572
名媛妹妹
名媛妹妹 2020-12-16 11:16

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,

相关标签:
4条回答
  • 2020-12-16 11:21

    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.

    0 讨论(0)
  • 2020-12-16 11:23

    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.

    0 讨论(0)
  • 2020-12-16 11:30

    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");
        }
    }
    
    0 讨论(0)
  • 2020-12-16 11:43

    No but take a look at http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx

    0 讨论(0)
提交回复
热议问题