需要有关创建自定义控件Asp.Net 3.5的帮助

时间:2009-12-30 19:19:14

标签: asp.net custom-controls

我正在寻找指向的链接或在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'不是已知元素。

3 个答案:

答案 0 :(得分:2)

这已经很晚了,我知道,但是这里......

我通过这样做成功地将.ascx UserControl转换为可再发行的dll:

  1. 创建名为 AscxDll
  2. 的ASP.NET 网站项目
  3. 在此位置的所述项目中开发了我的UserControl: 的〜/ App_UserControls / RadioButtonQuestion.ascx 即可。
  4. 发布了网站项目,只在“发布网站”对话框中勾选了这些设置:

    使用固定名称和单页程序集

    发出调试信息

  5. 打开VS cmd提示符并运行: aspnet_merge“C:\ PrecompiledWebOutputDir \ AscxDll”-o AssemblyName -r
  6. 将合并的AssemblyName.dll复制到另一个需要它的webapp / website项目的bin文件夹中。
  7. 在客户端项目的web.config中,将其添加到pages \ controls &lt; add tagPrefix =“MyPrefix”namespace =“ASP”assembly =“AssemblyName”/&gt;
  8. 在客户端项目中为网页添加了控件: &lt; MyPrefix:app_usercontrols_radiobuttonquestion_ascx ID =“rbq1”runat =“server”QuestionText =“由aspx源设置”/&gt;
  9. 注意它是如何使用 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方法中的操作的更多信息。