ASP.NET MVC 4 无法从表单中检索文件
Posted
技术标签:
【中文标题】ASP.NET MVC 4 无法从表单中检索文件【英文标题】:ASP.NET MVC 4 Can't retrieve file from form 【发布时间】:2013-07-04 11:59:23 【问题描述】:我正在开发一个列表网站,我正在尝试上传一张图片并将其路径存储在数据库中。
问题是,我似乎无法从表单中检索上传的文件。
这是表格,
@using (html.BeginForm())
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Product</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Location)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Location)
@Html.ValidationMessageFor(model => model.Location)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Condition)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Condition)
@Html.ValidationMessageFor(model => model.Condition)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Price)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PostedBy)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PostedBy)
@Html.ValidationMessageFor(model => model.PostedBy)
</div>
<div class="editor-field">
Upload Image <input type="file" name="listingImage" />
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
这是行动
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Product product, HttpPostedFileBase listingImage)
if (listingImage == null)
return RedirectToAction("Index");
if (ModelState.IsValid)
db.Products.Add(product);
db.SaveChanges();
return RedirectToAction("Index");
return View(product);
我有一个这样的产品列表设置模型。
public class Product
public int ID get; set;
public string Name get; set;
public string Description get; set;
public string Location get; set;
public string Condition get; set;
public decimal Price get; set;
public string PostedBy get; set;
public string PhotoPath get; set;
现在每次我完成表单并提交时,listingImage 都是空的,我会返回到索引。
我有什么遗漏吗?
谢谢。
【问题讨论】:
【参考方案1】:listingImage
不是模型的一部分,因此它不会获得与 Model.xx
其他属性相同的绑定。
您可以更新 Product
以包含 HttpPostedFileBase listingImage
并将控制器操作更改为
public ActionResult Create(Product product)
在您的 html 中,您可以像这样添加新属性
@using (Html.BeginForm("Create", "Products", FormMethod.Post, new enctype = "multipart/form-data" )) @* Forgot this line as Alex Skalozub told in his answer *@
@* code omitted *@
<div class="editor-field">
@Html.TextBoxFor(model => model.listingImage, new type = "file")
</div>
对于文件位置和保存,您可以在
行中做一些事情var path = Path.Combine(Server.MapPath("~/images/products"),product.listingImage.FileName);
product.listingImage.SaveAs(path);
【讨论】:
我尝试在我的模型中包含 HttpPostedFileBase,但出现类似于“密钥不能为空”行的错误。【参考方案2】:您必须将您的表单编码类型设置为“multipart/form-data”,否则您无法发布文件。
@using (Html.BeginForm("Create", "ControllerName", FormMethod.Post, new enctype = "multipart/form-data" ))
...
是的,您可以将文件与模型数据分开定义并像以前一样声明控制器操作,无需在模型类中包含文件字段:
public ActionResult Create(Product product, HttpPostedFileBase listingImage)
【讨论】:
非常感谢,这就是我正在寻找的解决方案。以上是关于ASP.NET MVC 4 无法从表单中检索文件的主要内容,如果未能解决你的问题,请参考以下文章
从 ASP.NET MVC 项目调用 .NET CORE 5 Web API 微服务时无法检索 BadRequest 错误