动态添加控件的代码有多优化

Gur*_*Rao 0 c# asp.net optimization html5

在我正在设计的网站中,我需要显示使用asp:FileUpload控件上传的图像.所以上传后我使用字符串生成器添加div,img和textarea,然后将其加载到我已经创建的面板中.因此,最好使用Stringbuilder加载内部HTML,或者使用HtmlgenericControls添加像image和textarea这样的控件是好的.我正在使用C#.我目前的编码方式如下:

前端:

<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>
Run Code Online (Sandbox Code Playgroud)

和后端如下:

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);        
    }
}
Run Code Online (Sandbox Code Playgroud)

请让我知道哪个是创建动态控件的好方法?

Ars*_*nko 5

最佳代码:

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

  • 不能与HTML CSS混合,加上作为演示相关的HTML属性,例如width,

  • 不使用JavaScriptalert.

让我们回到你的问题.哪一个更好:StringBuilder或者HtmlGenericControl

更好的是一个非常模糊的术语,让我们回答一堆略有不同的问题:

  1. 哪一个更快

    可能StringBuilder,鉴于它并不重要.完全没有.相比于花下载的图像(比如两秒钟即2000毫秒),中之间的业绩比较的时间StringBuilder,并HtmlGenericControl会比一毫秒少极有可能.浪费1毫秒是否重要.在一个需要2 000毫秒的过程中.

  2. 哪一个更安全

    您在以下代码中发现了多少错误?

    sb.Append("<div class=\"illustration\"><span-class=\"contents\">")
      .Append("<img class=" + "\"loadimg\"" + "srv=" + "\"" + newpath + "\"" + ">")
      .Append("/div></span>");
    
    Run Code Online (Sandbox Code Playgroud)

    让我们来看看:

    • divspan倒置,
    • 结束时div缺少'<'字符,
    • img 缺少'/'(如果输出是XHTML),
    • src写的拼写错误srv,
    • span-class本来应该的span class,
    • src(srv)之前没有空格.

    通过让.NET Framework从强类型对象生成HTML的任务,几乎可以轻松避免所有这些错误.

  3. 哪一个更具可读性

    IMO,都没有.HTML代码可以用干净的方式编写,使其具有极高的可读性.以同样的方式,如果代码是一块废话,那么在所有那些对嵌入式控件的调用中很容易丢失.

  4. 哪一个更可靠

    假设.NET Framework经过严格测试并且特别可靠,至少与普通业务应用程序相比.您对.NET Framework的信任越多越好,除非您知道如何做得更好并且您已经测试了您的方法,提交它以进行配对评审等.

    在这种情况下StringBuilder,您几乎无法对代码进行单元测试.让.NET Framework在您的位置执行HTML生成意味着您可以更专注于您操作的实际对象,并且测试它们会稍微容易一些.

那么,最好的解决方案是什么?

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

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

如果您需要编写干净,可读的HTML代码,那HtmlGenericControl将是一种负担,您将不得不选择字符串连接或一些模板系统.众所周知,ASP.NET控件用于生成不太好的HTML代码.鉴于您的问题中的HTML代码,此限制不适用于您的情况.