c# - 以一种形式上传多个文件 MVC4

标签 c# asp.net-mvc asp.net-mvc-4 file-upload

我想在一个表单上上传多张图片

@using (Html.BeginForm("Create", "AdminRestaurants", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-group">
    <label for="logoFile" class="col-sm-2 control-label">Logo:</label>
    <div class="col-sm-6">
        <input type="file" multiple="" name="logoFile" id="logoFile" />
    </div>
</div>
<div class="form-group">
    <label for="fohFile" class="col-sm-2 control-label">FOH Logo:</label>
    <div class="col-sm-6">
        <input type="file" multiple="" name="fohFile" id="fohFile" />
    </div>
</div>
<div class="form-group">
    <label for="bohFile" class="col-sm-2 control-label">BOH Logo:</label>
    <div class="col-sm-6">
        <input type="file" multiple="" name="bohFile" id="bohFile" />
    </div>
</div>
<div class="form-group">
    <label for="mgmFile" class="col-sm-2 control-label">MGM Logo:</label>
    <div class="col-sm-6">
        <input type="file" multiple="" name="mgmFile" id="mgmFile" />
    </div>
</div>

我正在尝试用这个处理 Controller 上的表单

public ActionResult Create(IEnumerable<HttpPostedFileBase> files, RestaurantModel collection)
{
    if (ViewData.ModelState.IsValid)
    {
    }
}

目前 Controller 上的files 签名中没有显示任何内容。当只处理一个文件时,这似乎很有效

public ActionResult Create(HttpPostedFileBase file, EventsModel collection)

有人可以指出允许使用一个提交表单上传多个文件的方向吗?

最佳答案

您的问题是您的表单创建了一个发布请求,其中包含模型绑定(bind)器可以绑定(bind)的信息,因为命名约定不正确。

你看,你有 4 个文件字段,每个字段都有不同的名称,为了让模型绑定(bind)器正确绑定(bind)它们,你的 Controller Action 签名应该如下所示:

public ActionResult Create(HttpPostedFileBase mgmFile, 
                           HttpPostedFileBase logoFile, 
                           HttpPostedFileBase fohFile ,
                           HttpPostedFileBase bohFile)

遵循 MCV 设计模式最好的选择是使用包含 IEnumerable<HttpPostedFileBase> 的 ViewModel 您将为 IEnumerable<HttpPostedFileBase> 创建自定义编辑器模板

这样你就可以像那样使用它了:

Html.EditorFor(m=>Model.filesUploaded)

并且您的 Controller 操作将如下所示:

public ActionResult Create(MyViewModel i_InputModel)
{
    i_InputModel.filesUploade; //Use the files here to upload them.
}

其他选项是: 在文件输入字段上使用 HTML5 多重属性,如下所示:

<label for="mgmFile" class="col-sm-2 control-label">Files:</label>
<div class="col-sm-6">
    <input type="file" multiple="multiple" name="files" id="files" />
</div>

和这样的 Controller 操作:

public ActionResult Create(HttpPostedFileBase files)

或者使用多个文件字段但在它们的名称中索引它们:

<input type="file" multiple="multiple" name="files[0]" id="files_1" />
<input type="file" multiple="multiple" name="files[1]" id="files_2" />
<input type="file" multiple="multiple" name="files[2]" id="files_3" />
<input type="file" multiple="multiple" name="files[3]" id="files_4" />

然后您可以使用这样的 Controller 操作:

public ActionResult Create(IEnumerable<HttpPostedFileBase> files)

关于c# - 以一种形式上传多个文件 MVC4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20208223/

相关文章:

只读集合属性的C#对象初始化

c# - 从动态对象 C# 中读取值

c# - 模型状态错误 : The value 'null' is not valid for nullable field

asp.net-mvc - 对静态文件的请求正在命中 ASP.NET MVC3 中的托管代码

asp.net-mvc - 将 id 从 View 传递给 Controller

C# 从字符串中获取具有特定模式的子字符串

c# - 使用 Roslyn 在服务器端 API 上安全执行代码

asp.net-mvc - 在 ASP.NET MVC 中使用 3 个下拉列表(日/月/年)选择日期

javascript - jquery : Globalize. js

c# - 在 C# 中使用 LINQ 进行分组需要帮助