不同项目中的Web用户控制

我在一个单独的项目“WebControls”中放了一些自制的Web用户控件,现在想从其他项目中重用它们

我的控制包括:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="WebControls.TestControl" %>
    <asp:Label ID="lblTest" runat="server" ></asp:Label>
    <asp:TextBox ID="textBox" runat="server" Width="" />
    <asp:HiddenField ID="hiddenFieldId" runat="server" />

与代码隐藏:

namespace WebControls
{
    public partial class TestControl : System.Web.UI.UserControl
    {
        public Unit Width
        {
            get { return textBox.Width; }
            set { textBox.Width = value; }
        }

        public string SelectedId
        {
            get { return hiddenFieldId.Value; }
            set { hiddenFieldId.Value = value; }
        }

         public string SelectedText
        {
            get { return textBox.Text; }
            set { textBox.Text = value;}
        }

        protected void Page_Init(object sender, EventArgs e)
        {

        }

        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}

我将它绑定到另一个项目中的网页中,如下所示:

<%@ Page Title="ToDo Serien" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="True" CodeBehind="RecurringToDos.aspx.cs" Inherits="TestAccess.RecurringToDos" %>
<%@ Register  Assembly="WebControls"  Namespace="WebControls" TagPrefix="aci"  %>

<asp:Content runat="server" ID="FeaturedContent" ContentPlaceHolderID="FeaturedContent">
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1><%: Title %>.</h1>
                <h2>Serienelement</h2>
                <aci:TestControl ID="aceRule" runat="server" Width="300"   />
                <asp:Button ID="btnSend" runat="server" OnClick="btnSend_Click" />
            </hgroup>

        </div>
....

当我现在启动页面时,它会在以下行中引发一个引用空异常:

set { textBox.Width = value; }

因为textBox = NULL

似乎我的控制没有正确启动。 我究竟做错了什么? 我该如何解决这个问题?


如果您想跨多个项目重用ascx用户控件,则应将ascx文件复制到使用者项目中,并按以下方式注册标签:

<%@ Register TagPrefix="uc" TagName="UserControl1" Src="~/UserControl1.ascx" %>

例如,您可以按照以下步骤操作:

  • WebUserControls创建一个新的Web项目名称

  • 添加一个Web窗体用户控件并将其命名为UserControl1

    <%@ Control Language="C#" AutoEventWireup="true" 
        CodeBehind="UserControl1.ascx.cs" Inherits="WebUserControls.UserControl1" %>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    

    并在后面的代码中添加:

    public string Text
    {
        get { return TextBox1.Text; }
        set { TextBox1.Text = value; }
    }
    
  • 在消费者项目中,添加对包含ascx用户控件的项目的引用。

  • 将控件的.ascx文件复制到消费者项目中。

    注意:您不需要将文件添加到项目中,但物理文件应该存在于您用作注册标记的Src的路径中。

  • 在您要使用该控件的页面中,添加以下内容:

    <%@ Register TagPrefix="uc" TagName="UserControl1" Src="~/UserControl1.ascx" %>
    
  • 这样使用控件:

    <uc:UserControl1 runat="server" Text="UserControl1" />
    
  • 注意

  • 如果您不想复制ascx文件,则可以使用不依赖ascx文件的Web Forms Server Control。 然后为了使用这些自定义控件,注册它们就足够了:

    <%@ Register Assembly="WebUserControls" Namespace="WebUserControls" TagPrefix="uc" %>
    
  • 这个答案依赖于Scott Guthrie在本主题中的一篇很棒的文章:创建和使用用户控制库
  • 链接地址: http://www.djcxy.com/p/36299.html

    上一篇: Web User Controls in different Project

    下一篇: Polymer. Way to dynamically add or remove observer