我希望用户在网格中输入数字列表,有点像宾果卡。
我的模型由一个"大小"(如果为 4,网格将是 4 x 4(和一个"字段"对象列表组成。字段由 X、Y 和值属性组成。
public class MyGrid {
public List<MyField> Fields { get; set; }
public int Size { get; set; }
public MyGrid() {
Size = 9;
Fields = new List<MyField>();
for (int y = 0; y < Size; y++) {
for (int x = 0; x < Size; x++) {
Fields.Add(new MyField { X = x, Y = y });
}
}
}
}
public class MyField {
public int X { get; set; }
public int Y { get; set; }
public int Value { get; set; }
public MyField() {}
}
现在,我希望我的视图呈现文本框网格。
@model MyGrid
@using (Html.BeginForm("Initialize", "MyGrid")) {
<table>
@for (int y = 0; y < Model.Size; y++) {
<tr>
@for (int x = 0; x < Model.Size; x++) {
<td>
@Html.TextBoxFor(s => s.Fields.Where(f => f.X == x && f.Y == y).First().Value)
</td>
}
</tr>
}
</table>
<button type="submit">Submit</button>
}
到目前为止,这是有效的。但是所有文本框都有 ID "值"。
有没有办法创建这个网格,以便我可以将整个网格提交到单个模型中?
使用此链接,我找到了答案: https://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/
我已经改变了我的观点(目前(:
以前:
<td>
@Html.EditorFor(s => s.Fields.Where(f => f.X == x && f.Y == y).First().Value)
</td>
后:
<td>
<input type="hidden" name="fields.Index" value="field_@x@y">
@Html.TextBoxFor(s => s.Fields.Where(f => f.X == x && f.Y == y).First().Value, new { @Name = "fields[field_" + x + y + "].Value" } )
</td>
因此,对于每个字段,将有一个"字段。索引"隐藏属性。 文本框本身将具有与隐藏字段的值和附加到它的属性相对应的名称。
这似乎有效