如何根据运行时数据在动态数据中选择DynamicField模板?

时间:2013-12-18 19:56:10

标签: c# asp.net webforms metadata asp.net-dynamic-data

我知道可以使用模型上的UIHint attribute将编译时参数字典传递给动态过滤器控件。不幸的是,这还不够。

例如,请考虑以下模型:

public class Device
{
    public string Unit {get; set;}
    public string Name {get; set;}
}

“单位”是我们模型中的隔离属性。一个单位不会干扰另一个单位。同时,多个单元共存于同一台服务器中,并由不同的客户端访问,具有不同的需求。

理想情况下,我希望在单位具有特定值时加载不同的动态字段。

考虑我有两个单位的情况:

  • unit1 :不需要自定义。从DynamicData\FieldTemplates文件夹

  • 加载[默认]动态模板
  • unit2 :位于“unit2”的客户端请求了另一种显示设备Name的方式,因此我们为该单元创建了一个自定义文件夹并更改了那里有Text.ascx模板。

结构如下所示:

New Dynamic field file structure

请注意,现在有两个“文本”字段模板。每当我操作的实例具有'unit2'作为Unit属性值时,想法是使用'unit2'文件夹中的那个。根FieldTemplates文件夹中的控件现在可以作为回退机制,以便在给定单位值不存在文件夹和控件时。

这些文件夹将在部署项目并创建单元后创建,根据我的看法,这应该不是问题。原始项目中唯一存在的文件是“默认”模板。

最初我考虑过创建自己的FieldTemplateFactory实现并将其附加到MetaModel,但它似乎无法访问对象的实际实例,只有MetaColumn }。之后,我决定查看DynamicFieldDynamicControl控件是如何实现的,但找不到任何可以实现我想要的扩展点。

我见过人们something similar, but with entire page templates。通过使用自定义路由,可以实现这一目标。但就我而言,由于我们正在讨论字段模板,因此不适用。

还有另一种方法我应该接近这个吗?我可以以某种方式将模板加载的决定基于对象内的属性值吗?是否有其他一些可能更简单的策略来显示不同单位的不同模板?

1 个答案:

答案 0 :(得分:0)

您可以通过路线而不是实时数据执行此操作,因为在绑定数据之前选择了字段模板。