我有一个包含模型的视图,这个模型包含一个列表(另一个模型),这个列表在我的视图中用动态重复字段填充;
型号:
public class CAOEntry
{
public CAOEntry()
{
this.TimeEntries = new List<TimeEntry>() { new TimeEntry() };
}
public DateTime ValidFrom { get; set; }
public DateTime ValidTo { get; set; }
public List<TimeEntry> TimeEntries {get; set;}
}
我的视图(创建处理TimeEntry列表的部分)
@Html.EditorFor(model => model.TimeEntries)
<button data-bind="click: addTimeEntry">Voeg tijdsvak toe</button>
<button data-bind="click: removeTimeEntry">Verwijder laatste</button>:
data-bind“click:addTimeEntry”是一个jQuery / KnockoutJs脚本,用于添加新的时间条目。这些是从编辑器模板添加的。 在这个编辑器模板中,我得到了以下代码:
@Html.EnumDropDownListFor(model => model.DayOfWeekOrHoliday,"--Selecteer een dag--", new { htmlAttributes = new { @class = "form-control", data_bind = "value: DayOfWeekOrHoliday, namePath: true" } })
现在,当我有两个TimeEntries填写并单击save时,会发生以下情况; 有三个时间条目返回给我的控制器: 一个包含第一个填充的枚举值,其他字段为空。 其他两个不包含任何枚举值,但填充了其他字段。
调试视图时,我看到了以下问题;
TimeEntry 1: enum field;
id="TimeEntries_0__DayOfWeekOrHoliday" name="TimeEntries[0].DayOfWeekOrHoliday"
第二个字段的示例:
id="TimeEntries_1__TimeFrom" name="TimeEntries[1].TimeFrom"
TimeEntry 2: Enum字段;
id="TimeEntries_0__DayOfWeekOrHoliday" name="TimeEntries[0].DayOfWeekOrHoliday"
第二个字段的示例:
id="TimeEntries_2__TimeFrom" name="TimeEntries[2].TimeFrom"
因此,对于枚举值,Array不会增加。这是因为EditorFor帮助器中有一个枚举字段吗? 我无法弄清楚如何解决这个问题。 [编辑] TimeEntry类:
public class TimeEntry
{
public int ID { get; set; }
//1:Monday,2:Tuesday,3:Wednesday,4:Thursday,5:Friday,6:Saturday,7:Sunday,8:Any Holiday
public enum Days {Maandag =1,Dinsdag =2, Woensdag=3,Donderdag = 4, Vrijdag= 5, Zaterdag=6, Zondag=7, Feestdag = 8}
[Required]
[Display(Name = "Dag")]
[Range(1, int.MaxValue, ErrorMessage = "Selecteer een dag")]
public Days DayOfWeekOrHoliday { get; set; }
[Required]
[Display(Name = "Start Tijdvak(uur:minuten)")]
[StringLength(5, MinimumLength = 5)]
[DataType(DataType.Time)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm}")]
public string TimeFrom { get; set; }
[Required]
[Display(Name = "Eind Tijdvak(uur:minuten)")]
[StringLength(5, MinimumLength = 5)]
[DataType(DataType.Time)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm}")]
public string TimeTo { get; set; }
[Required]
public decimal Premium { get; set; }
}
EditorFor:
function createViewModel() {
var createTimeEntry = function () {
return {
DayOfWeekOrHoliday: ko.observable(),
TimeFrom: ko.observable(),
TimeTo: ko.observable(),
Premium: ko.observable()
};
};
var addTimeEntry = function () {
TimeEntries.push(createTimeEntry());
};
var removeTimeEntry = function () {
TimeEntries.pop();
};
var ValidFrom = ko.observable();
var ValidTo = ko.observable();
var TimeEntries = ko.observableArray([createTimeEntry()]);
return {
ValidFrom: ValidFrom,
ValidTo: ValidTo,
TimeEntries: TimeEntries,
addTimeEntry: addTimeEntry,
removeTimeEntry: removeTimeEntry
};
}
$(document).ready(function () {
var viewModel = createViewModel();
ko.applyBindings(viewModel);
});
</script>