以前我上传了多个独立于我的模型的文件,如下所示:
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>
}
我有两个问题,首先也是最重要的是,虽然列表已正确返回到我的模型,但该文件为空,不太重要的是,名称只是简单地写为“名称”
任何帮助都会很棒,如果需要更多信息,请发表评论
答案 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" />