如何动态地遍历MVC数据模型中的字段名

本文关键字:数据模型 MVC 字段 遍历 何动态 动态 | 更新日期: 2023-09-27 17:53:51

在我的数据库结构中,我有一个特定用户的字段数组。像…

User: Choice1, Choice2, Choice3, Choice4, etc.

当View被发送到控制器时,将进入这些字段的值通过字符串数组(MyChoices[])从动态构造的隐藏输入集传递。

我的绝妙想法是使用for循环来遍历数组并分配值。比如:

for (int x = 0; x < MyChoices.Count(); x++ {
  model.Choice[x + 1] = MyChoices[x];
}

但是,我没有任何运气弄清楚如何动态地从模型中获取字段名,以便我可以分配它们。

基本上我正在寻找类似:model.GetField("Choice" + x + 1)

有什么办法可以做到吗?我正在考虑改革我的数据结构,这样,而不是列出Choice1, Choice2, Choice3等,我只有一个列出User, ChoiceID, ChoiceValue的选择表。但我不想重构我的数据,因为我有另一个页面它实际上是在表格中布局的。是否有办法做到这一点,或者我只是打破了每一个数据库/开发人员的戒律?

我知道这是一个相当"你如何做到这一点"类型的问题,但我一直在寻找,并没有真正找到一个解决方案…我实际上在寻找c#语法,所以我认为它是合格的。

下面是Model类:

public partial class UserChoice
{
    public int UserChoiceID { get; set; }
    public Nullable<int> UserID { get; set; }
    public string User { get; set; }
    public string Choice1 { get; set; }
    public string Choice2 { get; set; }
    public string Choice3 { get; set; }
    public string Choice4 { get; set; }
    public string Choice5 { get; set; }
    public string Choice6 { get; set; }
    public string Choice7 { get; set; }
    public string Choice8 { get; set; }
    public string Choice9 { get; set; }
    public string Choice10 { get; set; }
    public string Choice11 { get; set; }
    public string Choice12 { get; set; }
    public string Choice13 { get; set; }
    public string Choice14 { get; set; }
    public string Choice15 { get; set; }
    public string Choice16 { get; set; }
}

如何动态地遍历MVC数据模型中的字段名

如果你不知道将要出现什么字段或属性,你应该使用Reflection

文档示例:

            FieldInfo[] myField = myType.GetFields();
            for(int i = 0; i < myField.Length; i++)
            {                  
                    Console.WriteLine(myField[i].Name);
            }

如果您想动态地或在运行时获得属性名,您应该使用System。反射,你甚至可以获取或设置它们的值

好吧,我是这样做的:

首先,向Halford致敬…我的意思是,@Thorarins,因为他基本上把我引向了正确的方向。基本上,我可以通过以下命令完成我的任务:

for (int x = 0; x < MyChoices.Count(); x++)
{
    td.GetType().GetProperties().Single(p => p.Name == "Choice" + (x + 1)).SetValue(td, MyChoices[x]);
}

我的最终解决方案似乎有点笨拙和不自然。所以,如果谁有什么好主意,我洗耳恭听。