用模型对象替换Html中的占位符

时间:2014-01-23 05:26:35

标签: c# reflection

我很难解释我正在尝试做什么。它可能有一个名字,但我不知道它是什么。 首先,我有一个模型,如:

   public class Customer
   {
     public int Id { get; set; }
     public int ProductId { get; set; }
     ...more properties...

     public virtual Product Product { get; set; }
   }
   public class Product
   {
     public int Id { get; set; }
     public string Name { get; set; }
     public string Description { get; set; }
     ...more properties...

   }

其次,我在{}中有一个带有占位符的HTML文本字符串。我希望有类似{Id}的东西,并用模型属性替换Html文本。

  

< DIV><跨度>名称< /跨度><跨度> {ID} - {Product.Name}< /跨度>< / DIV>

我的想法是使用NameValueCollection将Model属性作为字符串。使用反射,我可以为基本属性执行此操作,但不能使用Product.Name

我是以错误的方式来做这件事的吗?我可以使用什么来获取我可以循环并替换Html的NameValueCollection?

这是我当前的代码(跳过虚拟属性):

public virtual NameValueCollection GetNameValueCollection(Object obj)
{
  Type type = obj.GetType();
  PropertyInfo[] properties = type.GetProperties();
  var coll = new NameValueCollection();
  foreach (PropertyInfo property in properties)
  {
    if(!property.GetGetMethod().IsVirtual)
    {
      if (property.PropertyType == typeof(DateTime))
      {
        var date = (DateTime)property.GetValue(obj, null);
        coll.Add(property.Name, date.ToLongDateString());
      }
      else if (property.PropertyType == typeof(DateTime?))
      {
        var date = (DateTime?)property.GetValue(obj, null);
        if (date.HasValue)
        {
          coll.Add(property.Name, date.Value.ToLongDateString());
        }
        else
        {
          coll.Add(property.Name, string.Empty);
        }
      }
      else
      {
        var value = property.GetValue(obj, null);
        if (value != null)
        {
          coll.Add(property.Name, value.ToString());
        }
      }
    }
  }
  return coll;
}

这应该是递归的,但似乎应该有更好的方法。顺便说一句,我不需要NameValueCollection专门(例如可能是Dictionary<string,string>)。思考?是否有一个nuget包已经这样做了?

1 个答案:

答案 0 :(得分:0)

我最后只使用了我所拥有的内容并添加了一个子部分来处理子对象。我不想做完整的递归,因为我只想要直接的子对象,而不是一直通过链。