通过dynamic 实现实体类属性动态新增

起因:

  在项目开发中遇到一个问题 后台表单根据用户配置会产生不同的表单字段,所以表设计结构为

在tb_ArticleAttributeField保存字段基本信息 根据用户配置在表tb_ArticleAttributeValue生成字段

表设计完成时遇到了问题,表结构根据用户配置会随时改变  产生的问题就是 实体类无法固定

绑定view时没法通过Model来进行绑定

在网上找了找到两种方法

DataTable 与dynamic

这篇主要描述采用dynamic如何处理

主要是:1、继承DynamicObject

    2、重写TrySetMember TryGetMember

源码如何下

/// <summary>
/// There are no comments for DTMVCCMS.Model.ArticleAttributeValue, DTMVCCMS.Model in the schema.
/// </summary>
[Table("tb_ArticleAttributeValue")]
public class ArticleAttributeValue: DynamicObject
{
/// <summary>
/// There are no comments for ArticleID in the schema.
/// </summary>
[Property("ArticleID", KeyType = KeyType.Identity)]
public virtual int ArticleID { get; set;}
private readonly Dictionary<string, object> _properties;
public ArticleAttributeValue (){}
public ArticleAttributeValue(Dictionary<string, object> properties)
{
_properties = properties;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (!_properties.Keys.Contains(binder.Name))
{
_properties.Add(binder.Name, value.ToString());
}
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return _properties.TryGetValue(binder.Name, out result);
}
}

控制器调用处理

dynamic myObj = new ExpandoObject();
Dictionary<string, object> dic = new Dictionary<string, object>()
{
{"Name","Frank"},
{"Age",23},
{"Work","码农"}
};

myObj = new ArticleAttributeValue(dic);
myObj.ArticleID = 1;
return View(myObj);

View调用

<div>
年龄为: @Model.Age
</div>
<div>
姓名为: @Model.Name
</div>
<div>
ID为: @Model.ArticleID
</div>
<div>
工作: @Model.Work
</div>

效果如下:

 

posted @ 2015-10-23 16:24  飘渺丶散人  阅读(1746)  评论(1编辑  收藏  举报