表单中的动态属性

时间:2015-02-19 11:38:02

标签: c# webforms

如何为动态属性创建表单?

所以我理解这是动态获取对象属性的方式:

ObjectName.GetType().GetProperty("nameofproperty")

如何在表格中加入以上内容?我试过这样做:

//loop through objects in model

 @Html.CheckBoxFor(model => m.ElementAt(i).Person.GetType().GetProperty("isAvailable"), new { @class = "person-avail" })

在模型中我将Person定义为这样的属性:

public Person Person { get; set; }

并且Person类拥有它自己的属性(我想为其创建表单的那些):

public class Person 
{    
      public String name {get; set;}
      public bool isAvailable {get; set;}
      .
      .
      . etc
}

所以此刻:

@Html.CheckBoxFor(model => m.ElementAt(i).Person.GetType().GetProperty("isAvailable"), new { @class = "person-avail" })

给我一​​个例外说:

Cannot implicitly convert type 'System.Reflection.PropertyInfo' to 'bool'

我明白问题是什么,但我将如何解决它呢?

1 个答案:

答案 0 :(得分:0)

鉴于您发布的示例,我不清楚为什么您不能像这样编写代码:

@Html.CheckBoxFor(model => m.ElementAt(i).Person.isAvailable,
    new { @class = "person-avail" })

即。由于Person属性已经输入为Person,因此无论如何都应该将名为isAvailable的属性存在。


也就是说,如果由于某种原因你真的必须通过反射出于某些未指明的原因,你在发布的代码中遇到的问题是反射只会给你PropertyInfo对象。要获取实际值,您需要将该对象应用于原始对象以检索属性值。例如:

@Html.CheckBoxFor(model => (bool)m.ElementAt(i).Person.GetType()
    .GetProperty("isAvailable").GetValue(m.ElementAt(i).Person),
    new { @class = "person-avail" })

换句话说,您必须将Person对象实例引用传递给PropertyInfo.GetValue()方法。由于该方法返回object(即盒装bool值),因此您还必须转回bool


<除了>
注意:如果您可以缓存m.ElementAt(i).Person值,即同时用于调用GetType()并传递给GetValue()方法,那么这是一个好主意。遗憾的是,我不太了解网络表单,无法知道该语法的外观或者即使它是可能的。如果你可以使用C#的完整lambda功能,可以这样做:

@Html.CheckBoxFor(model =>
    {
        Person person = m.ElementAt(i).Person;

        return (bool)person.GetType().GetProperty("isAvailable").GetValue(person);
    },
    new { @class = "person-avail" })

否则,我认为你可以自己解决这个问题。 :)

< /&除了GT;