在asp.net中的两个用户控件之间传递数据

时间:2012-07-21 03:35:44

标签: asp.net

我有一个UC_Categories.ascx (UC_1),它限制了categoryname。 UC_Products.ascx (UC_2)将按类别名称显示产品。它们都位于名为BookShop.aspx(Page)

Page

在页面中,当用户点击 UC_1 (步骤1)时,它将按类别名称呈现 UC_2 (步骤2)。我通过向页面发送带有类别名称的参数的请求来处理步骤1。 Step2创建一个新的 UC_2 ,设置属性值为categoryname,并执行FillProductByCategoryName方法。然后将 UC_2 添加到Page中的PlaceHolder。但我没有显示 UC_2

我需要每个人的帮助或建议。

感谢您阅读我的问题! ps:我的英语不是很好。

在UC2的代码隐藏中:

public void FillProduct()
    {

        ProductsMN productsMN = new ProductsMN();
        if (dlBook == null)
        {
            dlBook = new DataList();
            dlBook.DataSource = productsMN.GetByCategoryName(CategoryName);
            dlBook.DataBind();
        }
        else
        {
            dlBook.DataSource = productsMN.GetByCategoryName(CategoryName);
            dlBook.DataBind();
        }
    }

    public string CategoryName { get; set; }

在页面的代码隐藏中

 protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
        }
        string categoryName = Request.QueryString["categoryName"] as string;
        if (!string.IsNullOrWhiteSpace(categoryName))
        {
            BookContent.Controls.Clear(); // BookContent : Placeholder
            Control c = Page.LoadControl("~/UC/UC_Books.ascx") as UC.UC_Books;
            UC.UC_Books ucBook = new UC.UC_Books();
            ucBook.CategoryName = categoryName;
            ucBook.FillProduct(); //line 10
            BookContent.Controls.Add(ucBook); //line 11
        }

    }

在Page的PageLoad中,useBook包含数据。但在页面(视图)中,我看不到数据。我认为// line11不是执行或不是真的。

1 个答案:

答案 0 :(得分:1)

您需要将公共属性和UserControl控件的构造函数公开给父页面。

假设您的Usercontrol有一个标签:

<asp:Label ID="MyLabel" runat="server" visible="true"/>

在UserControl的代码隐藏中添加此内容。

    //Constructor
    public MyUserControl()
    {
        Category = new Label();
    }
    //Exposing the Label
    public Label Category
    {
        get { return this.MyLabel; }
        set { this.MyLabel = value; }
    }

假设您已将UserControl添加到父页面,其ID为“MyUserControl”。

要将UserControl的标签值设置为某个值,请使用:

MyUserControl.Category.Text=Response.QueryString["categoryname"];//Obviously you would want to encode it first.

如果需要在UserControl的代码隐藏中调用父页面的功能,则必须使用委托。我不推荐这种方法。