Html帮助<input type =“file”/>

有一个HTMLHelperfile upload? 具体来说,我正在寻找一个替代

 <input type="file"/> 

使用ASP.NET MVC HTMLHelper。

或者,如果我使用

 using (Html.BeginForm()) 

什么是file upload的HTML控件?

HTML上传文件ASP MVC 3。

模型 :( 请注意,FileExtensionsAttribute在MvcFutures中可用,它将validation客户端和服务器端的文件扩展名。

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

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

控制器操作

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

你也可以使用:

 @using (Html.BeginForm("Upload", "File", FormMethod.Post, new { enctype = "multipart/form-data" })) { <p> <input type="file" id="fileUpload" name="fileUpload" size="23" /> </p> <p> <input type="submit" value="Upload file" /></p> } 

我回想起同样的问题,遇到了Scott Hanselman的一篇post:

使用ASP.NET MVC实现HTTPfile upload,包括testing和模拟

希望这可以帮助。

改进版的Paulius Zaliaduonis的回答:

为了使validation正常工作,我不得不将模型更改为:

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

并认为:

 @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) } 

这是必需的,因为@Serj Sagan写的关于FileExtension属性只能和string一起工作。

要使用BeginForm ,下面是使用它的方法:

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

或者你可以做到这一点:

在你的HtmlHelper扩展类中:

 public static MvcHtmlString FileFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) { return helper.FileFor(expression, null); } public static MvcHtmlString FileFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> 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)); } 

这一行:

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

生成一个唯一的模型,你知道在列表和东西。 model [0] .Name等

在模型中创build正确的属性:

 public HttpPostedFileBase NewFile { get; set; } 

那么你需要确保你的表单将发送文件:

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

那么这里是你的帮手:

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

这也适用:

模型:

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

视图:

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

控制器操作:

 [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; } 

contentTypes列表

我猜这有点不好意思,但是会导致正确的validation属性等被应用

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