在MVC中上传多个文件作为模型的一部分

时间:2013-05-01 10:37:52

标签: c# asp.net-mvc file-upload model-binding

以前我上传了多个独立于我的模型的文件,如下所示:

MODEL:

 public class PoliciesAddViewModel
  {
 public List<PackageTypeItemViewModel> PackageTypeItems { get; private set; }

    public PoliciesAddViewModel() 
    {
      PackageTypeItems = new List<PackageTypeItemViewModel>();
    } 
  }

  public class PackageTypeItemViewModel
  {
    public string Name { get; set; }
    public bool IsRequired { get; set; }
    public int DisplaySequence { get; set; }
  }

查看:

@{
        int i = 1;
       }
       @foreach (var pick in Model.PackageTypeItems)
       {
        <div class="editor-label">
          <label for="@pick.Name.Trim()">
            @pick.Name.Trim():
          </label>
        </div>
        <div class="editor-field">
          <input class="text-box single-line" type="file" name="files" id="@String.Format("file_{0}", i)" data-val="@pick.IsRequired.ToString().ToLower()" data-val-required="Please select a file" />
            @Html.ValidationMessage("files")
        </div>
         {
           i = i + 1;
         }

控制器:

 [HttpPost]
        public ActionResult Add(IEnumerable<HttpPostedFileBase> files, PoliciesAddViewModel model)
        {
         //blah
        }

这一切都运行正常,但我知道我需要在文件中包含其他数据,最重要的是ID。

我试过更新我的模型:

  public class PackageTypeItemViewModel
  {
    public int PackageTypeItemId { get; set; }
    public HttpPostedFileBase File { get; set; }    
    public string Name { get; set; }
    public bool IsRequired { get; set; }
    public int DisplaySequence { get; set; }
  }

我的观点:

 @for (int i = 0; i < Model.PackageTypeItems.Count; i++)
        {
         @Html.HiddenFor(m => m.PackageTypeItems[i].PackageTypeItemId)
        <div class="editor-label">
         @Html.LabelFor(m => m.PackageTypeItems[i].Name)
        </div>
        <div class="editor-field">
          <input class="text-box single-line" type="file" name="File" id="@String.Format("file_{0}", i)" data-val="@Model.PackageTypeItems[i].IsRequired.ToString().ToLower()" data-val-required="Please select a file" />
            @Html.ValidationMessage("files")
        </div>
        }

我有两个问题,首先也是最重要的是,虽然列表已正确返回到我的模型,但该文件为空,不太重要的是,名称只是简单地写为“名称”

任何帮助都会很棒,如果需要更多信息,请发表评论

1 个答案:

答案 0 :(得分:3)

您必须更改视图中的文件输入,以启用模型绑定器将文件输入绑定到模型内的HttpPostedFileBase属性。

<input class="text-box single-line" type="file" name="@String.Format("PackageTypeItems_{0}__File", i)"  id="@String.Format("PackageTypeItems[{0}].File", i)" data-val="@Model.PackageTypeItems[i].IsRequired.ToString().ToLower()" data-val-required="Please select a file" />

<强>编辑:

如果您使用的是MVC 4,可以使用@Html.IdFor@Html.NameFor这样

 <input class="text-box single-line" type="file" name="@Html.NameFor(m => m.PackageTypeItems[i].File)"  id="@Html.IdFor(m => m.PackageTypeItems[i].File)" data-val="@Model.PackageTypeItems[i].IsRequired.ToString().ToLower()" data-val-required="Please select a file" />