繁体   English   中英

ASP.NET WebForms中的字符串与控件

[英]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.ControlSystem.String

由于C#是一种强类型语言,所以接受System.Web.UI.Control的方法(如System.Web.UI.ControlCollection Add )不能接受System.String作为参数。

类似地,假定divHtmlSystem.StringBuilder ,没有Append对方法System.StringBuilder服用类型System.Web.UI.Control ,因此试图通过img到现有的Append方法将失败。

(由于未为您的方法和属性使用正确的名称,您可能也难以编译代码;这是Controls not controlsAdd not addAppend 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM