对于初学者,也许有人可以帮助更好地命名问题。
我正在努力实现的目标:
下面是我想要实现的一个非常简单的示例,仅使用基本的工作部件就能够得出我正在寻找的解决方案。
我希望能够在 .ascx.cs 代码隐藏中创建以下文件:
public partial class DynamicControl<T> : System.Web.UI.UserControl where T : class
{
public List<T> Items;
public void Add(T item) {
Items.Add(item);
}
}
在 .ascx 文件中正确引用它:
<% foreach (var item in Items) { %>
<p>item.Name</p>
<% } %>
并将其加载到带有如下标签的 .aspx 文件中:
<custom:DynamicControl ID="DynamicControl1" ItemType="Person" runat="server" />
甚至在 .aspx.cs 代码隐藏中为:
DynamicControl1.ItemType = Type.GetType("Person");
真的,一切皆有可能。
我只需要一种在我的网站上创建通用用户控件的方法,我可以在其中以编程方式(或在标签中)设置项目类型,并使用 .ascx.cs 和 .ascx 文件以及引用 .aspx 文件.
我试过的:
1) 创建一个DynamicControlBuilder
并继承ControlBuilder
类,然后使用 . 作为属性附加它[ControlBuilder(typeof(DynamicControlBuilder))]
。结果使控件没有将泛型类型添加到 .aspx.designer.cs 文件中,因此 .ascx 文件也不知道如何呈现。
2)创建使用泛型类型的类的内部属性DynamicControl
,只是我找不到一个很好的解决方案,默认成员类似于DynamicControl<dynamic>
或类似的东西 - 因为显然该对象在那时不兼容而且我不会得到任何自动完成或编译时错误处理。
3) 使用类似的方法,Add<T>(T item) where T : class
例如,这就是我现在正在做的事情......但如果我想向单个控件添加大量项目,这会变得很难看。我不希望开发人员每次都必须为每个方法重新声明类型。它也没有解决List<T> Items
那里的问题,这意味着我没有从那一端得到自动完成,这也很丑陋。
先感谢您!