[英]Strings versus controls in ASP.NET WebForms
为什么不能将图像附加到ASP中的div?
divHtml.append(img);
为什么我必须使用div.controls.add(img);
?
为什么不能将字符串添加到controls.add这样说
div.controls.add(img + String.Format("{0}", reader.GetString(0));
? 最初是“一开始”
我有以下代码:
cn.Open();
using (OdbcCommand cmd = new OdbcCommand("SELECT Wallpostings FROM WallPosting WHERE UserID=" + theUserId + " ORDER BY idWallPosting DESC", cn))
using (OdbcDataReader reader = cmd.ExecuteReader())
{
var divHtml = new System.Text.StringBuilder();
while (reader.Read())
{
divHtml.Append("<div id=test>");
divHtml.Append(String.Format("{0}", reader.GetString(0)));
divHtml.Append("</div>");
}
test1.InnerHtml = divHtml.ToString();
}
}
}
这给了我这个输出(注意css已应用并且所有间距等都很好而整洁:
然后我做了这段代码:
while (reader.Read())
{
System.Web.UI.HtmlControls.HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
//div.ID = "test";
div.Style["float"] = "left";
Image img = new Image();
img.ImageUrl = "~/userdata/2/uploadedimage/batman-for-facebook.jpg";
img.AlternateText = "Test image";
div.Controls.Add(img);
test1.Controls.Add(div);
System.Web.UI.HtmlControls.HtmlGenericControl div1 = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
//div1.ID = "test";
div1.InnerText = String.Format("{0}", reader.GetString(0));
div1.Style["float"] = "left";
test1.Controls.Add(div1);
System.Web.UI.HtmlControls.HtmlGenericControl div2 = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
//div2.ID = "test";
div2.Style["clear"] = "both";
test1.Controls.Add(div2);
}
}
}
}
}
这是我的结果,可以,但是如果您仔细注意每个注释之间没有css,则div不在css的范围内,因此我尝试应用注释的行以查看它是否可以工作,但它有点时髦tbh。 特别是当您在萤火虫中查看它时:
如果我尝试使用下面提到的方法解析控件,就会发生这种情况:
cn.Open();
using (OdbcCommand cmd = new OdbcCommand("SELECT Wallpostings FROM WallPosting WHERE UserID=" + userId + " ORDER BY idWallPosting DESC", cn))
{
using (OdbcDataReader reader = cmd.ExecuteReader())
{
test1.Controls.Clear();
while (reader.Read())
{
System.Web.UI.HtmlControls.HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
div.ID = "test";
div.Style["float"] = "left";
Image img = new Image();
img.ImageUrl = "~/userdata/2/uploadedimage/batman-for-facebook.jpg";
img.AlternateText = "Test image";
div.Controls.Add(img);
div.Controls.Add(ParseControl(String.Format("{0}", reader.GetString(0)));
test1.Controls.Add(div);
编辑:
using (OdbcDataReader reader = cmd.ExecuteReader())
{
test1.Controls.Clear();
while (reader.Read())
{
System.Web.UI.HtmlControls.HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
div.Attributes["class"] = "test";
div.Style["float"] = "left";
div.ID = "test";
//div.Style["float"] = "left";
Image img = new Image();
img.ImageUrl = "~/userdata/2/uploadedimage/batman-for-facebook.jpg";
img.AlternateText = "Test image";
div.Controls.Add(img);
div.Controls.Add(ParseControl(String.Format("{0}", reader.GetString(0))));
test1.Controls.Add(div);
Shadow设法使它起作用,我也使用了来自其他注释的解析。
但是问题仍然存在,test1 div不能随着test div扩展:
<asp:Button ID="Button1" runat="server" Text="Post Message" Width="98px"
onclick="Button1_Click" />
</p>
<p>
</p>
<div id="test1" runat="server" />
//could be this line
</asp:Content>
或者可能是
test1.Controls.Add(div);
在我的代码中可能没有被选中或放在正确的括号中? CSS:
div#test1
{
}
div .test
{
width:90%;
z-index:1;
padding:27.5px;
border-top: thin solid #736F6E;
border-bottom: thin solid #736F6E;
color:#ffffff;
margin:0 auto;
white-space: pre;
white-space: pre-wrap;
white-space: pre-line;
word-wrap: break-word;
}
img
的类型为System.Web.UI.Control
,这是Controls.Add
接受的类型。 特别是System.Web.UI.Control
与System.String
。
由于C#是一种强类型语言,所以接受System.Web.UI.Control
的方法(如System.Web.UI.ControlCollection
Add
)不能接受System.String
作为参数。
类似地,假定divHtml
是System.StringBuilder
,没有Append
对方法System.StringBuilder
服用类型System.Web.UI.Control
,因此试图通过img
到现有的Append
方法将失败。
(由于未为您的方法和属性使用正确的名称,您可能也难以编译代码;这是Controls
not controls
, Add
not add
和Append
not append
。)
如果您确实需要这样做,则可以始终为此创建扩展方法:
public static class ControlExtensions
{
public static void Add(this WebControl control, string html)
{
control.Controls.Add(new Literal
{
Text = html, Mode = LiteralMode.PassThrough
});
}
}
现在您可以执行以下操作:
div.Controls.Add(String.Format("{0}", reader.GetString(0)));
因为控件不仅仅是字符串。 它们是在实际呈现时变成html字符串的对象。 在ASP.NET Web窗体中阅读有关控件和页面生命周期的内容。
您可以将字符串添加到控件,则必须使用ParseControl()将字符串转换为控件,或作为控件
div.controls.add(ParseControl(String.Format("{0}", reader.GetString(0)));
您要添加图像以及来自数据库的文字文本。
正确的方法确实是添加控件-像您已经拥有的Image
控件一样,对于文本,请使用Literal
服务器控件:
div.Controls.Add(img);
div.Controls.Add(new LiteralControl(reader.GetString(0)));
编辑:如果您出于自己的原因坚持获取图像控件的HTML字符串,则可以使用以下代码:
StringBuilder html = new StringBuilder();
using (StringWriter stringWriter = new StringWriter(html))
{
using (HtmlTextWriter textWriter = new HtmlTextWriter(stringWriter))
{
image.RenderControl(textWriter);
}
}
这会将图像渲染为html
变量,然后您可以像最初一样将字符串值分配给其他控件的Text
。 例如:
myLabel.Text = html.ToString();
编辑II:将CSS应用于要添加的控件,首先将CSS本身从此: div#test
更改为: div .test
现在,将这一行添加到您的代码中:
System.Web.UI.HtmlControls.HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
div.Attributes["class"] = "test";
div.Style["float"] = "left";
...
这会将类应用于每个顶级div
并且可以用于应用适当的CSS。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.