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