我有一个带表单的创建视图。它有一个输入文本(环境),输入文件(徽标)下拉列表(平台)和视图模型列表(天)。
这工作正常。现在我想添加一个“动态字段”来插入文件。典型的添加文件,删除文件。我看到这是用淘汰赛完成的。我的问题是如何处理HttpPostedFileBase和敲除,最糟糕的是,一个HttpPostedFileBase和淘汰列表。
我已经这样做了,但它不起作用。任何帮助都将非常感激。
CreateView的:
@model HPRWT.ViewModels.ReportViewModel
<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/knockout-2.1.0.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/knockout.namepathbinding.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/Files.js")" type="text/javascript"></script>
@using (Html.BeginForm("Create", "Service", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Report</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Enviroment)
@Html.EditorFor(model => model.Enviroment, new { data_bind = "value: enviroment" })
@Html.ValidationMessageFor(model => model.Enviroment)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Logo)
@Html.TextBoxFor(model => model.Logo, new { type = "file", data_bind = "value: logo" })
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PlatformID)
@Html.DropDownListFor(model => model.PlatformID, Model.Platforms.Select(f => new SelectListItem { Text = f.name, Value = f.ID.ToString() }))
</div>
<div class="editor-label">
@Html.LabelFor(model => model.InputFiles)
@for (int j = 0; j < Model.InputFiles.Count; j++)
{
@Html.TextBoxFor(model => model.InputFiles[j], new { type = "file", data_bind = "value: inputFile" })
}
<button data-bind="click: addFile">Add Log</button>
<button data-bind="click: removeFile">Remove Log</button>
</div>
<table id="hours">
@for (int i = 0; i < 7; i++)
{
<tr>
<td>@Model.Days[i].Label</td>
@for (int j = 0; j < 24; j++)
{
<td><div>@Html.CheckBoxFor(model => model.Days[i].Hours[j].Selected)@Html.LabelFor(model => model.Days[i].Hours[j].Selected, @" ")</div></td>
}
</tr>
}
</table>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
Files.js
function createViewModel() {
var createFile = function () {
return {
inputFile: ko.observable()
};
};
var addFile = function () {
inputFiles.push(createFile());
};
var removeFile = function () {
inputFiles.pop();
};
var enviroment = ko.observable();
var logo = ko.observable();
var inputFiles = ko.observableArray();
return {
enviroment: enviroment,
logo: logo,
inputFiles: inputFiles,
addFile: addFile,
removeFile: removeFile
};
}
$(document).ready(function () {
var viewModel = createViewModel();
ko.applyBindings(viewModel);
});
ReportViewModel:
public class ReportViewModel
{
public int ID { get; set; }
public IEnumerable<Platform> Platforms { get; set; }
public int PlatformID { get; set; }
public string Enviroment { get; set; }
public HttpPostedFileBase Logo { get; set; }
public IList<HttpPostedFileBase> InputFiles { get; set; }
public IList<DayViewModel> Days { get; set; }
public ReportViewModel()
{
Days = Enumerable.Range(1, 7).Select(day => new DayViewModel { Value = day }).ToList();
InputFiles = new List<HttpPostedFileBase>();
}
}
DayViewModel:
public class DayViewModel
{
public int Value { get; set; }
public virtual IList<HourViewModel> Hours { get; set; }
public DayViewModel()
{
Hours = Enumerable.Range(0, 24).Select(hour => new HourViewModel { Value = hour }).ToList();
}
}
HourViewModel:
public class HourViewModel
{
public int Value { get; set; }
public bool Selected { get; set; }
}
答案 0 :(得分:0)
尝试使用 InputFiles 数组而不是IList
我不确定IList但是当你将属性作为List时,你必须将html字段 name 保持为fieldlist.propname。 index (和 Id 将是fieldlist_propname_ index ),其中索引将从0开始为默认或第一个字段,当您添加新控件时,其名称应该像fieldlist.propname一样增加。 0 (第一个)然后是fieldlist.propname。 1 等等...... 然后只有模型绑定器才能绑定。
如果有效,可以尝试使用Array,然后我认为你很高兴