繁体   English   中英

动态添加控件可以使代码达到最佳状态

[英]How optimal the code can be with dynamically adding the controls

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

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

最佳代码:

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

  • 请勿将CSS与HTML以及与演示文稿相关的HTML属性(例如width

  • 不使用JavaScript alert

让我们回到您的问题。 哪个更好StringBuilderHtmlGenericControl

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

  1. 哪一个更快

    可能无关紧要的StringBuilder 完全没有 与下载图像所花费的时间(例如2秒,即2 000 ms)相比, StringBuilderHtmlGenericControl之间的性能比较可能不到一毫秒。 浪费1毫秒重要吗? 耗时2000毫秒。

  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代码,此限制不适用于您的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM