我有一个视图,它生成可变数量的元素,所有元素都有不同的名称,如下所示:
for (int i = 1; i < Model.NumRubbers; i++)
{
... some code
for (int j = 1; j < Model.NumSetsInRubbers; j++)
{
<input type="number" min="0" size="3" maxlength="3"
class="number homescore scoreinput form-control"
name="match_@i-homeset_@j"
id="match_@i-homeset_@j"/>
因此,您可以看到使用变量名称创建的元素数量不确定。我应该如何在控制器中构造我的输入类以保存这些值?
答案 0 :(得分:1)
最好的方法是在模型中处理对象的创建,然后对模型的各个部分使用EditorFor模板。这样可以在您的视图部件中实现更简单的代码和SOC。
SomeModel.cs
public class SomeModel
{
public List<SomeOtherType> NumSetsInRubbers { get; set; }
public SomeModel(int numRubbers, int numSetsInRubbers)
{
// this is just a flimsy example to show how you can create a list of nodes. Notet hat you could nest nodes in other node types but it was hard to gleam from your example how you actually had the code setup
this.NumSetsInRubbers = new List<SomeOtherType>(numRubbers*numSetsInRubbers);
for(int i = 0; i < NumSetsInRubbers.Count; i++)
NumSetsInRubbers[i] = new SomeOtherType();
}
}
public class SomeOtherType
{
public int Match { get; set; }
}
然后,您应该使用SomeOtherType
<强> EditorTemplates \ SomeOtherType.cshtml 强>
@model SomeOtherType
@Html.InputFor(x => x.Match)
原始模板 - 然后调用上面的编辑器模板
@model SomeModel
@Html.EditorFor(x => x.NumSetsInRubbers)
在您的视图代码中,您有一个嵌套对象,如果您有一个包含其他类型的包含类型,也可以复制此行为。您可以继续在模板中调用(链)EditorFor。 EditorFor处理集合并为集合中的每个项添加一个视图实例。
答案 1 :(得分:0)
就个人而言,我不会尝试在这种情况下创建请求模型,而是依赖于FormCollection
参数。
public ActionResult Foo (FormCollection form)
{
// to get values out of the collection, use the indexer property
var foo = form["match_1-homeset_2"];
}
您可能不想像示例所示那样对代码进行硬编码,更有可能在服务器端执行嵌套循环来处理数据。
答案 2 :(得分:-1)
使用JavaScript迭代您的输入集合,并使用AJAX构建一个发送到控制器的对象。