0

在我正在设计的网站中,我需要显示我使用 asp:FileUpload 控件上传的图像。因此,在上传后,我使用字符串生成器添加 div、img 和 textarea,然后将其加载到我已经创建的面板中。那么使用Stringbuilder加载内部HTML更好还是使用HtmlgenericControls添加图像和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);        
    }
}

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

4

1 回答 1

5

最佳代码:

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

  • 不将 CSS 与 HTML 以及与演示相关的 HTML 属性(例如width,

  • 不使用 JavaScriptalert

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

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

  1. 哪个更快

    可能StringBuilder,考虑到这并不重要。完全没有。与下载图像所花费的时间(比如两秒,即 2 000 毫秒)相比,两者之间的性能比较StringBuilderHtmlGenericControl可能不到一毫秒。浪费 1 毫秒重要吗?在一个需要 2 000 毫秒的过程上?

  2. 哪个更安全

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

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

    让我们来看看:

    • div并且span是倒置的,
    • 结尾div缺少“<”字符,
    • img缺少“/”(如果输出是 XHTML),
    • 有一个错字src写成srv
    • span-class应该是span class
    • src( )之前没有空格srv

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

  3. 哪个更具可读性

    海事组织,也不是。HTML 代码可以以简洁的方式编写,使其具有极强的可读性。同样,如果代码是废话,那么很容易在所有对嵌入式控件的调用中迷失方向。

  4. 哪个更可靠

    至少与一般的商业应用程序相比,.NET Framework 被认为经过大量测试并且特别可靠。您对 .NET Framework 的信任越多越好,除非您知道如何做得更好,并且您已经测试了您的方法,将其提交以供结对审查等。

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

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

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

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

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

于 2013-07-09T12:03:55.047 回答