将按钮放置在动态创建的字符串中

本文关键字:创建 字符串 动态 按钮 | 更新日期: 2023-09-27 18:12:42

我正试图从数据库中的产品创建一个产品页面。当我试图在代码中添加一个创建的按钮时,当我把它放在字符串中时,它只会显示"System.WebControls.button"。

现在我明白了为什么会发生这种情况,但我想不出如何添加真正的物理按钮的解决方案。

我的代码:

Button in_cart = new Button();
in_cart.Text = "Put in cart";
in_cart.Click += new EventHandler(send_to_cart);
in_cart.ID = PRODUCT_ID //Product ID is filled in by the ID from the database
//Webstring consists out of more lines but this is the line where it goes wrong
string webstring = in_cart;
productHolder.InnerHtml = webstring;
    private void send_to_cart(object sender, EventArgs e)
    {
        Button clicked = (Button)sender;
        int id = int.Parse(clicked.ID);
        Response.Redirect(string.Format("startpage.aspx?ID={0}", id));
        //Going to startpage just for the testing
    }

将按钮放置在动态创建的字符串中

这不是一个好的做事方式。最好避免从代码后面动态创建控件(这样做时必须特别注意(。为了这个答案,让我们避开它。

单个产品页面

在.aspx页面上定义按钮:

<asp:Button runat="server" id="in_cart" Text="Put in cart" OnClick="send_to_cart" />

然后在你的代码后面(.aspx.cs(

protected void Page_Load()
{
    in_cart.CommandArgument=PRODUCT_ID; //assuming you load this from database
}
protected void send_to_cart(object sender, EventArgs e)
{
    Response.Redirect(String.Format("startpage.aspx?ID={0}", in_cart.CommandArgument));
}

请注意,我使用按钮的命令参数来传递产品ID,因为按钮的ID是从代码后面引用按钮的方式,我们不能让它是动态的。此外,您的事件处理程序已受到保护,因此可以正确连接。此外,你的命名方案不是很好,应该更具描述性。以下是我的做法:

<asp:Button runat="server" id="AddToCartBtn" Text="Put in cart" OnClick="AddToCartBtn_Click" />
protected void Page_Load()
{
    //assuming you load product from database, possibly using Entity Framework
    AddToCartBtn.CommandArgument = product.ProductId;
}
protected void AddToCartBtn_Click(object sender, EventArgs e)
{
    Response.Redirect(String.Format("startpage.aspx?ID={0}", AddToCartBtn.CommandArgument));
}

这更具可读性和描述性。

多个产品页面

该技术类似于将包含从数据库中提取的产品列表的页面。让我们使用Repeater,它可以数据绑定到产品列表,同时仍然让我们对HTML有很好的控制。

<asp:Repeater runat="server" id="ProductsRepeater">
    <ItemTemplate>
        Product Name: <%# ((Product)Container.DataItem).Name %><br />
        Product Description: <%# ((Product)Container.DataItem).Description %><br />
        <asp:Button runat="server" id="AddToCartBtn" OnClick="AddToCartBtn_Click" CommandArgument='<%# ((Product)Container.DataItem).ProductId() %>' />
        <hr /> 
    </ItemTemplate>
</asp:Repeater>

因此,中继器将为我们的对象创建HTML。让我们现在把它接线。请注意,我将数据绑定代码放在if语句中,以确保它不是回发,从而避免重新绑定数据。

protected void Page_Load()
{
    if(!IsPostback)
    {
         List<Product> products=new List<Product>();
         products.Add(new Product(){Name="Toothbrush", Description="Fights cavities", ProductId="tb1"});
         products.Add(new Product(){Name="Vacuum Cleaner", Description="super vac!", ProductId="vac"});
         products.Add(new Product(){Name="iPod", Description="Plays your music.", ProductId="ipod"});
         ProductsRepeater.DataSource=products;
         ProductsRepeater.DataBind();
    }
}
protected void AddToCartBtn_Click(object sender, EventArgs e)
{
    Button button=sender as Button;
    string productid=button.CommandArgument;
    Response.Redirect(String.Format("startpage.aspx?ID={0}", productid));
}

您需要一个Products类来处理这个示例。您可以将其放在代码后面,也可以将其放入App_code文件夹中的Products.cs中。

public class Product
{
    public string Name {get; set;}
    public string Description {get; set;}
    public string ProductId {get; set;}
}

我为您构建了一组示例对象,但我假设您将从数据库中加载这些对象(如果您还没有相应的计划,请查看EntityFramework(。如果您不想使用实体框架,而只想使用纯ADO.NET,则可以始终绑定到DataTable。