【问题标题】:Upload multiple files in MVC3 with model binding使用模型绑定在 MVC3 中上传多个文件
【发布时间】:2012-04-25 00:56:53
【问题描述】:

所以我想对我的唱片收藏进行编目。我也想学习一些MVC。所以我决定在 MVC 中建立一个记录编目网站。我就是这样工作的。

我只是在尝试,但不知道如何将多个文件上传到我的 SQLCE 数据库。我对这里的选项持开放态度 - 将图像存储为 BLOBS 或简单地存储为文件名并将图像上传到文件系统。

我的简单模型是这样的:

public class Record
{
    [ScaffoldColumn(false)]
    public int RecordId { get; set; }
    [Required(ErrorMessage = "Artist is required")]
    public string Artist { get; set; }
    [Required(ErrorMessage = "Title is required")]
    public string Title { get; set; }
    [DisplayName("Release Date")]
    [DisplayFormat(DataFormatString = "{0:d}")]
    public DateTime ReleaseDate { get; set; }
    [Required(ErrorMessage = "Format is required")]
    public string Format { get; set; }
    public string Label { get; set; }
    [DisplayName("Catalogue Number")]
    public string CatalogueNumber { get; set; }
    public string Matrix { get; set; }
    public string Country { get; set; }
    public IEnumerable<HttpPostedFileBase> Images { get; set; }
    public string Notes { get; set; }
}

我的观点是:

@model Records.Models.Record
@{
    ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Record</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Artist)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Artist)
        @Html.ValidationMessageFor(model => model.Artist)
    </div>

    // snipped for brevity

    <div class="editor-label">
        @Html.LabelFor(model => model.Notes)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.Notes)
        @Html.ValidationMessageFor(model => model.Notes)
    </div>
    <div class="editor-field">
       <input type="file" name="images" id="image1"/>
       <input type="file" name="images" id="image2"/>
       <input type="file" name="images" id="image3"/>
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

而我的 Create 方法是:

 [HttpPost]
    public ActionResult Create(Record record, IEnumerable<HttpPostedFileBase> images)
    {
        if (ModelState.IsValid)
        {
            foreach (HttpPostedFileBase image in images)
            {
                if (image.ContentLength > 0)
                {
                    var fileName = Path.GetFileName(image.FileName);
                    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                    image.SaveAs(path);
                } 
            }

            db.Records.Add(record);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        return View(record);
    }

但是,images(我的 Create 方法参数)始终为 null,而 Model.IsValid 始终为 false。

这是为什么?我尝试将我的图片上传输入命名为“image”、“Image”、“image[n]”,并且 images 始终为 0。

我真的不想为此使用任何插件,有没有简单的原生 MVC 方式?我愿意帮助!

提前致谢。

【问题讨论】:

  • 您是否有一个 [HttpGet] 最初传回模型的实例?我看到你得到了 [HttpPost] 部分。
  • @Geovani,是的,我确实有一个仅显示视图的 [HttpGet] 方法。
  • 在 HTTPGET 中你是返回一个记录实例还是只是正常返回 View();您可以编辑您的问题并发布您的 HTTGET 方法的代码吗?

标签: asp.net-mvc model-binding image-upload


【解决方案1】:

我以前吃过这个。这可能是解决办法。

您的视图中似乎缺少multipart/form-data (@using (Html.BeginForm()))

尝试将@using (Html.BeginForm()) 替换为 @using (Html.BeginForm("action", "controller", FormMethod.Post, new { enctype = "multipart/form-data" }))

显然用你的替换动作和控制器。

希望这会有所帮助〜会

编辑:抱歉,刚刚看到发布的日期,如果你还没有弄清楚,那么可能是这样吗?

【讨论】:

    【解决方案2】:

    一个完美的博客关于这个Here

    【讨论】:

    • 精彩帖子.. 感谢分享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多