C# 循环遍历已编号的属性以在Razor页面中生成输入

C# 循环遍历已编号的属性以在Razor页面中生成输入,c#,asp.net-mvc,razor,razor-pages,C#,Asp.net Mvc,Razor,Razor Pages,我有一个带有34个编号属性的模型,如下所示 Public Class ViewModel { public string RatingCategory01 { get; set; } public string RatingCategory02 { get; set; } public string RatingCategory03 { get; set; } //...and so on until category #34 } 我不想为Razor页面中的每个

我有一个带有34个编号属性的模型,如下所示

Public Class ViewModel
{
    public string RatingCategory01 { get; set; }
    public string RatingCategory02 { get; set; }
    public string RatingCategory03 { get; set; }
    //...and so on until category #34
}
我不想为Razor页面中的每个类别编写输入代码,而是希望使用循环来迭代所有类别并生成适当的控制组。我尝试了以下代码:

<tbody>
    @for (var i = 1; i < 35; i++)
    {
        string n;

        @if (i > 0 && i < 10)
        {
            n = "RatingCategory0" + i.ToString();
        }
        else
        {
            n = "RatingCateogry" + i.ToString();
        }
        <tr>
            <td>
                <label asp-for="@string.Format("RatingCategory" + n)" class="control-label"></label>
            </td>
            <td>
                <select asp-for="@string.Format("RatingCategory" + n)" asp-items="Model.CategoryRatingSelectList">
                    <option value="">Select</option>
                    </select>
            </td>
            <td>
                <input asp-for="@string.Format("RemedialTime" + n)" class="form-control" />
            </td>
        </tr>
    }
</tbody>

@对于(变量i=1;i<35;i++)
{
字符串n;
@如果(i>0&&i<10)
{
n=“RatingCategory0”+i.ToString();
}
其他的
{
n=“RatingCatalogy”+i.ToString();
}
选择
}
当我构建项目并导航到该页面时,出现以下错误:

InvalidOperationException:模板只能与字段一起使用 访问、属性访问、一维数组索引或 单参数自定义索引器表达式

我不确定我在这条路上是否走对了。我真的很想创建一个循环来生成这些输入,以便将来的维护和更改更容易。从我的代码/问题中可以很明显地看出,我对这一点非常陌生,因此非常感谢您的帮助

编辑以添加解决方案:

我使用了Ed Plunkett提供的解决方案,我在下面进行了检查。我对它做了一些修改,最终创建了一个名为“Rating”的新类,因为我发现在实践中我需要一个更复杂的对象。在我看来是现在

public List<Rating> Ratings = { get; set; }
public List Ratings={get;set;}
在控制器中,我使用一个循环,根据我需要的数量,在列表中添加我需要的任意多个空评级

for (var i = 0; i < 34; i++)
    {
        vm.Ratings.Add(new Rating());
    }
for(变量i=0;i<34;i++)
{
添加(新评级());
}
尽管随着应用程序的发展,这可能会被更新为使用硬编码以外的数字

最后,我在视图中使用了一个循环,为列表中的每个评级创建了一组控件。在这种情况下,它是一个TableRow,在不同的列中包含不同的控件:

@for (var i = 0; i < Model.Ratings.Count; i++)
    {
        <tr>
            <td>
                @Html.DisplayFor(model => model.Ratings[i].Category)
            </td>
            <td>
                <div class="form-group">
                    <select asp-for="Ratings[i].RatingValue" asp-items="Model.CategoryRatingSelectList">
                        <option value="">Select</option>
                    </select>
                </div>
            </td>
            <td>
                <input asp-for="Ratings[i].RemediationMinutes" class="form-control" />
            </td>
        </tr>
    }
(变量i=0;imodel.Ratings[i].Category) 选择 } 我发现这组输入中的数据可以通过简单地包括

List<Rating> Ratings
列出评级

在提交表单时运行的任何方法的参数中。

您可以将模型类转换为字典

var viewModel = new ViewModel()
{
    RatingCategory01 = "a",
    RatingCategory02 = "b",
    RatingCategory03 = "c"
};
var dictionaryModel = viewModel.GetType()
    .GetProperties(BindingFlags.Instance | BindingFlags.Public)
    .ToDictionary(prop => prop.Name, prop => prop.GetValue(viewModel, null));

然后,您可以在视图中迭代字典。

这是您想要的,而不是34个属性及其隐含的34个
补救时间
同级:

public List<String> RatingCategory { get; set; } = new List<String>();
public List<String> RemedialTime { get; set; } = new List<String>();
public List RatingCategory{get;set;}=new List();
公共列表修正时间{get;set;}=new List();
如果您有34个某物,并且名称仅因索引号不同,则这是一个集合,而不是34个具有顺序编号名称的不同属性。然后,您可以使用
foreach
循环枚举34个项目,或者通过
RatingCategory[33]
将它们单独索引为
RatingCategory[0]
。在C#中,集合索引从零开始,因此第一个是
0
,第三十四个是
33
。你会习惯的


您还应该查找String.Format()的作用
String.Format(“Foo”+1)
“Foo”+1
完全相同

public List RatingCategory{get;set;}=new List()。如果您有34个某物,并且名称仅因索引号不同,则这是一个集合,而不是34个具有顺序编号名称的不同属性。然后,您可以使用
foreach
循环枚举34项。我明白您的意思。提交表单时,我是在视图中迭代/索引它们以生成输入,还是在控制器中迭代/索引它们?