打造可持续发展的事业

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

在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   PM2004  阅读(2616)  评论(4编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
< 2009年10月 >
27 28 29 30 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7

导航

统计

点击右上角即可分享
微信分享提示