2013-07-09 24 views
0

在我设计的网站中,我需要显示使用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> 

和后端如下:

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);   
    } 
} 

请让我知道这将是创建动态控制的好办法?

+1

你的问题不清楚。你目前的方法是否有效?如果没有,请标记您的问题并要求管理员迁移到StackOverflow。如果你的方法有效,那么问题是什么?你想优化什么?你为什么认为你需要优化?这些细节将有助于社区回答您的问题或找到合适的地方。 – GlenH7

+0

@ GlenH7 ..我目前的做法很好,很好。我正在讨论的问题就像是使用stringbuilder会好还是HtmlGenericControls提供更简单的步骤来动态地将它们包含为Html标签..嗯,我想我找到了我的问题的答案.. :)谢谢... –

回答

5

优化代码:

  • 不包含超过50行难以阅读的代码(同意,这并不难懂,但仍然,轻微重构将帮助),

  • 隐而不宣” t将CSS与HTML混合在一起,以及与演示相关的HTML属性,例如width,

  • Doesn't use the JavaScript alert

让我们回到你的问题。哪一个是更好StringBuilderHtmlGenericControl

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

  1. 哪一个是更快

    可能StringBuilder,因为它并不重要。完全一样。与下载图像花费的时间相比(例如两秒,即2 000毫秒),StringBuilderHtmlGenericControl之间的性能比较将很可能小于一毫秒。浪费1毫秒是否重要?在一个需要2 000 ms的进程上。

  2. 哪一个是更安全

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

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

    让我们来看看:

    • divspan反转,
    • 收盘div缺少 '<' 字,
    • img缺少 '/'(如果输出XHTML),
    • src中有一个输入为srv,
    • span-class应该已经span class
    • srcsrv)之前没有空格。

    几乎所有这些错误都可以通过让.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代码,这个限制不适用于你的情况。

+0

@ MainMa ..非常感谢你提供了一个美丽的解决方案。 +1的解释。谢谢... :) –

+0

@MainMa ...而不是使用JavaScript警报,还有什么可以使用? :)请让我知道.. –

+1

@Kaushik:见http://ux.stackexchange.com/q/42012/6729 –