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 4 表单无法注销

从 ASP.NET MVC 项目调用 .NET CORE 5 Web API 微服务时无法检索 BadRequest 错误

ASP.Net MVC4排序检索分页的实现

ASP.NET MVC 4 (一)路径映射

ASP.NET Core MVC:无法在表单标签内呈现字段

ASP.NET MVC 文件上传