C# 动态添加控件时代码的优化程度

C# 动态添加控件时代码的优化程度,c#,asp.net,optimization,html,C#,Asp.net,Optimization,Html,在我设计的网站中,我需要显示使用asp:FileUpload控件上传的图像。所以在上传之后,我使用字符串生成器添加div、img和textarea,然后将其加载到我已经创建的面板中。因此,使用Stringbuilder加载内部HTML更好,还是使用HtmlgenericControls添加图像和文本区域等控件更好。我用的是C#。我目前的编码方式如下: protected void uploadFile_Click(object sender, EventArgs e) { if (Upl

在我设计的网站中,我需要显示使用asp:FileUpload控件上传的图像。所以在上传之后,我使用字符串生成器添加div、img和textarea,然后将其加载到我已经创建的面板中。因此,使用Stringbuilder加载内部HTML更好,还是使用HtmlgenericControls添加图像和文本区域等控件更好。我用的是C#。我目前的编码方式如下:

protected void uploadFile_Click(object sender, EventArgs e)
{
    if (UploadImages.HasFiles)
    {
       int tid = 0;

       string fileExt = Path.GetExtension(UploadImages.FileName).ToLower();
       if (fileExt == ".jpeg" || fileExt == ".png" || fileExt == ".jpg" || fileExt == ".bmp")
       {
           HtmlGenericControl d = new HtmlGenericControl("div");
           Button btnsave = new Button();
           btnsave.Text = "Save";


           sb.Append("<div class=" + "\"savback\"" + ">");
           sb.Append("<div class=" + "\"head\"" + ">Write Description</div>");

           foreach (HttpPostedFile uploadedFile in UploadImages.PostedFiles)
           {
               id += 1;
               tid = tid + 1;
               string textid = "txt" + tid;
               filepath = Server.MapPath("~/Images/Gallery/" + uploadedFile.FileName);
               uploadedFile.SaveAs(filepath);
               newpath = "../Images/Gallery/" + uploadedFile.FileName;
               try
               {
                   updtpanel.Visible = true;

                   sb.Append("<div class=" + "\"dataload\"" + ">");
                   sb.Append("<img class=" + "\"loadimg\"" + "src=" + "\"" + newpath.ToString() + "\"" + " />");
                   sb.Append("<textarea  class=" + "\"txtdes\"" + "id=" + "\"" + textid + "\"" + "></textarea>");
                   sb.Append("</div>");


               }

               catch (Exception ex)
               {
                   Response.Write(ex.Message);
               }

           }

           sb.Append("</div>");
           d.InnerHtml = sb.ToString();

           updtpanel.Controls.Add(d);
           updtpanel.Controls.Add(btnsave);
       }
       else
       {
           Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Please Select only Image Files!!');", true);
       }

    }
    else
    {
        Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Please Select a File First!!');", true);        
    }
}
前端:

<form id="form1" runat="server">

<div class="transbox" id="mainbk" runat="server" style="position:absolute; top:0px; left:0px; width: 100%; height: 100%;" >
  <asp:FileUpload runat="server" ID="UploadImages" style="background-color:white; position:absolute; font-family:'Palatino Linotype'; font-size:medium; top: 4px; left: 350px; right: 251px;" Width="500px" AllowMultiple="true"/>
    <asp:Button runat="server" ID="uploadedFile" style="position:absolute;  font-family:'Palatino Linotype'; font-size:medium; top: 4px; left: 870px; width: 112px; height: 29px;" Text="Upload" OnClick="uploadFile_Click" />
    <asp:Panel ID="updtpanel" runat="server" CssClass="transbox" style="width:100%;height:100%;left:0px;top:0px;position:absolute" Visible="false">

    </asp:Panel>
 </div>


</form>

其后端如下所示:

protected void uploadFile_Click(object sender, EventArgs e)
{
    if (UploadImages.HasFiles)
    {
       int tid = 0;

       string fileExt = Path.GetExtension(UploadImages.FileName).ToLower();
       if (fileExt == ".jpeg" || fileExt == ".png" || fileExt == ".jpg" || fileExt == ".bmp")
       {
           HtmlGenericControl d = new HtmlGenericControl("div");
           Button btnsave = new Button();
           btnsave.Text = "Save";


           sb.Append("<div class=" + "\"savback\"" + ">");
           sb.Append("<div class=" + "\"head\"" + ">Write Description</div>");

           foreach (HttpPostedFile uploadedFile in UploadImages.PostedFiles)
           {
               id += 1;
               tid = tid + 1;
               string textid = "txt" + tid;
               filepath = Server.MapPath("~/Images/Gallery/" + uploadedFile.FileName);
               uploadedFile.SaveAs(filepath);
               newpath = "../Images/Gallery/" + uploadedFile.FileName;
               try
               {
                   updtpanel.Visible = true;

                   sb.Append("<div class=" + "\"dataload\"" + ">");
                   sb.Append("<img class=" + "\"loadimg\"" + "src=" + "\"" + newpath.ToString() + "\"" + " />");
                   sb.Append("<textarea  class=" + "\"txtdes\"" + "id=" + "\"" + textid + "\"" + "></textarea>");
                   sb.Append("</div>");


               }

               catch (Exception ex)
               {
                   Response.Write(ex.Message);
               }

           }

           sb.Append("</div>");
           d.InnerHtml = sb.ToString();

           updtpanel.Controls.Add(d);
           updtpanel.Controls.Add(btnsave);
       }
       else
       {
           Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Please Select only Image Files!!');", true);
       }

    }
    else
    {
        Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Please Select a File First!!');", true);        
    }
}
受保护的无效上载文件\u单击(对象发送方,事件参数e)
{
if(上传images.HasFiles)
{
int-tid=0;
字符串fileExt=Path.GetExtension(UploadImages.FileName.ToLower();
如果(fileExt==“.jpeg”| | fileExt==”.png“| | fileExt==”.jpg“| | fileExt==”.bmp”)
{
HtmlGenericControl d=新的HtmlGenericControl(“div”);
按钮btnsave=新按钮();
btnsave.Text=“保存”;
某人加上(“”);
某人附加(“写描述”);
foreach(UploadImages.PostedFiles中的HttpPostedFile uploadedFile)
{
id+=1;
tid=tid+1;
字符串textid=“txt”+tid;
filepath=Server.MapPath(“~/Images/Gallery/”+uploadedFile.FileName);
uploadedFile.SaveAs(文件路径);
newpath=“../Images/Gallery/”+uploadedFile.FileName;
尝试
{
updtpanel.Visible=true;
某人加上(“”);
某人加上(“”);
某人加上(“”);
某人加上(“”);
}
捕获(例外情况除外)
{
响应。写入(例如消息);
}
}
某人加上(“”);
d、 InnerHtml=sb.ToString();
updtpanel.Controls.Add(d);
updtpanel.Controls.Add(btnsave);
}
其他的
{
Page.ClientScript.RegisterStartupScript(GetType(),“msgbox”,“警报('请仅选择图像文件!!');”,true);
}
}
其他的
{
Page.ClientScript.RegisterStartupScript(GetType(),“msgbox”,“警报('请先选择一个文件!!');”,true);
}
}
请告诉我哪种方法是创建动态控件的好方法???

最佳代码:

  • 不包含超过50行难以阅读的代码(同意,它不是不可读的,但小的重构会有所帮助)

  • 不会将CSS与HTML以及与演示文稿相关的HTML属性(如
    width
    )混合使用

让我们回到你的问题上来。哪个更好:
StringBuilder
还是
HtmlGenericControl

作为一个非常模糊的术语,让我们回答一些稍微不同的问题:

  • 哪一个更快

    可能是
    StringBuilder
    ,因为这无关紧要。完全与下载图像所花费的时间(例如两秒钟,即2000毫秒)相比,
    StringBuilder
    HtmlGenericControl
    之间的性能比较很可能不到一毫秒。在一个需要2000毫秒的过程中浪费1毫秒是否重要

  • 哪个更安全

    您在下面的代码中发现了多少错误

    sb.Append("<div class=\"illustration\"><span-class=\"contents\">")
      .Append("<img class=" + "\"loadimg\"" + "srv=" + "\"" + newpath + "\"" + ">")
      .Append("/div></span>");
    
    sb.追加(“”)
    .Append(“写为
    srv
  • span class
    应该是
    span class
  • src
    srv
    )前面没有空格
  • 通过让.NET Framework从强类型对象生成HTML,几乎所有这些错误都可以很容易地避免

  • 哪一个更具可读性

    在我看来,这两种.HTML代码都不能以干净的方式编写,因此可读性非常强。同样,如果代码是一堆垃圾,那么在所有这些对嵌入式控件的调用中都很容易丢失

  • 哪个更可靠

    .NET Framework被认为是经过严格测试且特别可靠的,至少与一般业务应用程序相比是如此。您向.NET Framework吐露的信息越多越好,除非您知道如何做得更好,并且您已经测试了您的方法,并将其提交给结对评审等

    StringBuilder
    的情况下,您很难对代码进行单元测试。让.NET Framework代替您生成HTML意味着您可以更专注于您所操作的实际对象,并且测试它们稍微容易一些

  • 那么,单一的最佳解决方案是什么

    就我个人而言,如果我坚持使用经典的ASP.NET(与ASP.NET MVC相反),我将使用HTML模板创建一个专用控件

    如果由于某些原因,这是不可能的,那么选择HtmlGenericControl
    :它将抽象HTML并让您专注于对象本身

    如果您需要编写干净、可读的HTML代码,
    HtmlGenericControl
    将是一个负担,您必须选择字符串连接或一些模板系统。ASP.NET控件因生成不太好的HTML代码而闻名。鉴于您所问的HTML代码,此限制不适用于您的case.

    最佳代码:

    • 不包含超过50行难以阅读的代码(同意,它不是不可读的,但小的重构会有所帮助)

    • 不会将CSS与HTML以及与演示文稿相关的HTML属性(如
      width
      )混合使用

    让我们回到你的问题。哪一个更好:
    StringBuilder
    还是
    HtmlGenericControl

    作为一个非常模糊的术语,让我们回答一些稍微不同的问题:

  • 哪一个是