打造可持续发展的事业

事业像系统的框架,要稳定、可扩展,同样需要精心设计的!

在Dynamic Data Framework下实现Lookup字段下拉列表模板

背景

我们知道如果两个表之间有外键关系,Dynamic data framework会为相应的字段添加下拉列表来选择相应的值,提供了友好的操作方式。

但是在实际应用中我们通常会有些数据字典或者松散的关联关系,比如


这个图中,创建人就是来自用户表中。关系如下(两个关联的字段类型都是
Guid):


但二者并没有建立显式的外键关系。

我们希望在aspnet_module 在显示时,显示友好的名称,而不是一串Guid,在编辑的界面能够下拉选择。如下图:


解决方案

解决这个问题有两个方面:

  1. (1)        定制界面;
  2. (2)        获取数据,包括静态界面数据和下拉列表中的数据;

.net Framework3.5 SP1中,提供了强大的Metadata动态绑定方法,这是Dynamic data framework基础之一。网上已经有大量的资料来描述。值得一提的是UIHint这个属性,它为我们定制显示提供了很好的扩展能力。

[DisplayName("创建人")]

[UIHint("SamEnumeration", null, "TableName", "aspnet_Users","LookupField","UserId","ResultField","UserName")]

public Guid CreatedBy { get; set; }

我希望这个UIHint传入了参数

{TableName=” aspnet_Users”, LookupField ="UserId", ResultField="UserName"}

其含义就是 CreatedBy这个字段是来自于aspnet_UsersUserId字段,显示时请利用对应记录的UserName字段

我们需要定制两个ascx文件对对应的静态界面和编辑界面进行Render


对于静态的页面
SamEnumeration.ascx如何获取数据呢?

关键我利用了Linq中的ExecuteQuery方法,当然我们也可以利用Dynamic Expression表达式。关键就是拼一个sqlExecuteQuery去执行,代码如下:


Code

我增加了一个whereCondition来支持筛选一些记录。

这样我们就可以直接在SamEnumeration.ascxGetLookupValue的结果显示在页面上。前端代码很简单:

Code

Code Behind:

Code

这里有一个技巧如何取得UIHint传过来的参数,请看代码:

Code

同理我们定制SamEnumeration_Edit.ascx,这个比较复杂的地方在如何将数据绑定到dropdownlist中。前端代码依然很简单:

Code

我定义了一个类来存放用于绑定的数据:

Code

 

还是定义了一个取得数据的方法,和前面不同的是这个方法将返回一个IEnumerable<SamLookupData>类型。

Code

看得出,我还是在拼这个SQL语句。

取得了这个之后,绑定到前端的dropdownlist就简单了。

在这个代码中我加入一个空值的item,便于将值设置为空。

Code

为了更改生效,需要重载方法ExtractValues,代码如下:

Code

到此这个问题已经得到了圆满解决。

 

posted on 2009-10-11 13:23  PM2004  阅读(2611)  评论(4编辑  收藏  举报

导航