【问题标题】:Dynamic properties in form表单中的动态属性
【发布时间】:2015-02-19 11:38:02
【问题描述】:

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

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

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'

我了解问题所在,但我该如何解决呢?

【问题讨论】:

  • 这个问题可能对stackoverflow.com/questions/1196991/…有帮助
  • @MattC 谢谢,但我已经想出了如何动态获取属性信息。问题是,当我创建表单时,我还不知道某个属性的值是多少 - 所以我的问题是如何将上述内容集成到表单中。
  • @MattC 如何从表单中添加用户输入?它只会得到它的当前值。
  • 你试过了吗 - @Html.CheckBoxFor(model => m.ElementAt(i).Person.GetType().GetProperty("isAvailable").GetValue(m.ElementAt(‌​i) .Person), new { @class= "person-avail" })
  • 哦,好的,我明白了,您希望对来自网络表单的动态属性进行读写。如果您最初设置了值,那么当表单回发到控制器时,复选框中的值应该在发回的 Person Model 对象中。

标签: c# webforms


【解决方案1】:

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

@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() 方法,那将是一个好主意。不幸的是,我对 Web 表单的了解不够深入,无法知道该语法会是什么样子,或者即使它是可能的。如果您可以使用 C# 的完整 lambda 功能,则可以这样做:

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

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

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

【讨论】:

  • 谢谢,我刚刚尝试过,但在转换为布尔值时出现以下错误:模板只能用于字段访问、属性访问、单维数组索引或单参数自定义索引器表达式.我确实尝试直接绑定属性,但它不会将数据保存回模型,所以我正在寻找不同的解决方案,这就是为什么我想用反射来做到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 2012-08-04
相关资源
最近更新 更多