将具有变量名称的属性传递给控制器​​

时间:2016-03-24 14:35:16

标签: c# asp.net-mvc

我有一个视图,它生成可变数量的元素,所有元素都有不同的名称,如下所示:

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"/>

因此,您可以看到使用变量名称创建的元素数量不确定。我应该如何在控制器中构造我的输入类以保存这些值?

3 个答案:

答案 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构建一个发送到控制器的对象。