2013-07-09 22 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 –