我正在寻找指向的链接或在Asp.net 3.5中创建自定义控件的walkthru。
我已经看过以下内容:
http://forums.asp.net/t/1385382.aspx:将.ascx用户控件转换为可再发行的自定义控件asp.net 3.5
http://msdn.microsoft.com/en-us/library/aa479318.aspx:将.ascx用户控件转换为可再发行的自定义控件asp.net 2.0
我认为以上两个链接适用于复合自定义控件,这对于现在来说很好,因为它似乎更容易制作复合而不是完整的自定义控件。
根据上面链接(aa479318)中的说明,我创建了一个用户控件MyControl.ascx文件并将其发布,并将其编译为一个自包含的.dll文件,名为App_Web_MyControl.ascx.cdcab7d2。
然后我放了一个
<%Register Assembly="App_Web_MyControl.ascx.cdcab7d2"
TagPrefix="cc" namespace="TheNamespace" %>
在我希望使用自定义控件的aspx文件(在另一个应用程序中)中,我在项目中添加了对.dll程序集的引用。
当我尝试通过
在.aspx代码中创建CustomControl时,无法识别CustomControl名称<cc:MyControl ID="idname" runat="server" />
我得到错误元素'MyControl'不是已知元素。
答案 0 :(得分:2)
这已经很晚了,我知道,但是这里......
我通过这样做成功地将.ascx UserControl转换为可再发行的dll:
发布了网站项目,只在“发布网站”对话框中勾选了这些设置:
使用固定名称和单页程序集
发出调试信息
注意它是如何使用 namespace =“ASP”在web.config中注册的,以及网页上的标记如何在其中包含一些下划线&lt; MyPrefix:app_usercontrols_radiobuttonquestion_ascx /&gt 强> 这可能是你出错的关键?
这对我很有用,虽然我花了很多时间才弄明白。除非您的UI非常复杂,否则构建服务器控件或复合控件可能更容易。
希望这有助于某人。
答案 1 :(得分:0)
请查看Scott's Post on Registration,因为这将允许您注册您的UserControl,您已将其转换为web.config中的自定义控件。这允许您设置控件的标记名称,因为类的实际名称可能在生成的App_Web_MyControl.ascx.cdcab7d2 dll中被破坏。
这有希望让你做类似以下的事情......
<?xml version="1.0"?>
<configuration>
<system.web>
<pages>
<controls>
<add tagPrefix="cc" assembly="App_Web_MyControl.ascx.cdcab7d2" tagName="MyControl"/>
</controls>
</pages>
</system.web>
</configuration>
...因此回避你的班级名称“MyControl”问题。
另一种选择是使用.Net Reflector进入你的App_Web_MyControl.ascx.cdcab7d2程序集(之前不应该说dll),并弄清楚“MyControl”改变了什么。这有点丑陋,因为这个生成的名称可能会在您重新编译App_Web_MyControl时随时更改
答案 2 :(得分:0)
如果我是你,我会从这里开始:
创建“ASP.Net Server Control”类型的项目。它应该创建一个看起来像这样的类(我的类叫做ServerControl):
[DefaultProperty("Text")]
[ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
public class ServerControl1 : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? "[" + this.ID + "]" : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Text);
}
}
然后,您可以添加字段和属性以及方法(公共,私有或受保护)。如果您不想覆盖RenderContents方法,可以通过重写CreateChildControls方法来创建复合控件(请参阅this example)。
查看HtmlTextWriter类,了解有关上述RenderContents方法中的操作的更多信息。