如何为动态属性创建表单?
所以我理解这是动态获取对象属性的方式:
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'
我明白问题是什么,但我将如何解决它呢?
答案 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;