【问题标题】:Need help on creating Custom Controls Asp.Net 3.5在创建自定义控件 Asp.Net 3.5 方面需要帮助
【发布时间】:2010-12-31 05:10:25
【问题描述】:

我正在寻找在 Asp.net 3.5 中创建自定义控件的说明或演练链接。

我已经看过以下内容:

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 文件并将其发布,然后将其编译为一个名为 App_Web_MyControl.ascx.cdcab7d2 的自包含 .dll。

然后我放了一个

<%Register Assembly="App_Web_MyControl.ascx.cdcab7d2" 
              TagPrefix="cc" namespace="TheNamespace" %> 

在我想要使用自定义控件的 aspx 文件(在另一个应用程序中)中,我添加了对项目中 .dll 程序集的引用。

当我尝试在 .aspx 代码中创建 CustomControl 名称时,它无法被识别

<cc:MyControl ID="idname" runat="server" />

我收到错误元素“MyControl”不是已知元素。

【问题讨论】:

    标签: asp.net custom-controls


    【解决方案1】:

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

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

    1. 创建了一个名为 AscxDll 的 ASP.NET Web Site 项目
    2. 在此位置的上述项目中开发了我的 UserControl: ~/App_UserControls/RadioButtonQuestion.ascx
    3. 在“发布网站”对话框中仅勾选这些设置即可发布网站项目:

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

      发出调试信息

    4. 打开 VS cmd 提示符并运行: aspnet_merge "C:\PrecompiledWebOutputDir\AscxDll" -o AssemblyName -r
    5. 将合并的 AssemblyName.dll 复制到另一个需要它的 webapp/网站项目的 bin 文件夹中。
    6. 在客户端项目的 web.config 中,将此添加到 pages\controls
    7. 向客户端项目中的网页添加了控件:

    注意它是如何使用 namespace="ASP" 在 web.config 中注册的,以及网页上的标签如何在其中包含一些下划线 这可能是您出错的关键?

    这对我来说效果很好,虽然我花了好几年才弄明白。除非您的 UI 非常复杂,否则只构建一个服务器控件或复合控件可能更容易。

    希望这对某人有所帮助。

    【讨论】:

    • 您可以使用 Visual Studio Web 部署项目自动执行此过程,该项目执行aspnet_merge 过程以及用于程序集和命名空间输出的可配置接口。我的问题与stackoverflow.com/questions/1006086 相关。 MSDN 上的 Web 部署项目:microsoft.com/downloads/…
    • 好的,谢谢,我应该试试。虽然我不愿意重新打开这个特别凌乱的蠕虫罐!
    【解决方案2】:

    查看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 时发生变化

    【解决方案3】:

    如果我是你,我会从这里开始:

    创建“ASP.Net 服务器控件”类型的项目。它应该创建一个如下所示的类(我的类称为 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 方法中做什么的更多信息。

    【讨论】:

    • 这绝对是创建服务器控件而不是生成/重用用户控件的正确方法。我假设您绝对必须为特定目的进行 UserControl 操作。如果没有,您绝对应该使用上述方法来编写您的服务器控件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2010-11-28
    • 2020-09-02
    • 1970-01-01
    • 2023-03-13
    • 2014-08-11
    • 2012-03-18
    相关资源
    最近更新 更多