Html帮助<input type =“file”/>
有一个HTMLHelper
file 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\""))