如何动态循环MVC数据模型中的字段名称?

时间:2016-07-01 05:15:23

标签: c# .net asp.net-mvc

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

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等,而是只有一个Choices表,其中列出了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; }
}

3 个答案:

答案 0 :(得分:1)

如果您不知道哪些字段或属性应该使用反射

Documentation

样品:

            FieldInfo[] myField = myType.GetFields();

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

答案 1 :(得分:0)

如果您想动态或在运行时获取属性名称,则应使用System.Reflection,甚至可以获取或设置其值

答案 2 :(得分:0)

好的,这就是我做的方式:

首先,哈特福德的帽子......我的意思是,@ Thorarins,因为他几乎把我引向了正确的方向。从本质上讲,我能够通过以下方式完成我的任务:

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

我的最终解决方案似乎有点笨拙和不自然。所以,如果有人有任何好的想法如何让它变得更好,我会全力以赴。