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

时间:2014-07-11 15:06:05

标签: c# asp.net webforms

我正在尝试从数据库中的产品创建产品页面。当我尝试在代码中添加一个创建的按钮时,它只会在我将它放入字符串时显示“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
    }

1 个答案:

答案 0 :(得分:2)

这不是一种好的做事方式。最好避免从后面的代码动态创建控件(在执行此操作时必须考虑特殊注意事项)。为了这个答案,让我们避免它。

单品页

在.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;}
}

我为您构建了一组示例对象,但我假设您要从数据库中加载这些对象(如果您还没有为此计划,请查看Entity Framework )。如果您不想使用实体框架并且只想使用普通ADO.NET,则始终可以绑定到DataTable