2013-07-09 2 views
0

На веб-сайте, который я проектирую, мне нужно показать изображения, которые я загружаю с помощью asp: FileUpload control. Поэтому после загрузки я добавляю div, img и textarea с помощью построителя строк, а затем загружаю его в панель, которую я уже создал. Так что лучше использовать Stringbuilder для загрузки внутреннего HTML или полезно использовать HtmlgenericControls для добавления элементов управления, таких как изображение и текстовое поле. Я использую C#. Мой текущий способ кодирования заключается в следующем:Насколько оптимальным может быть код с динамическим добавлением элементов управления

Frontend:

<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.

Вернемся к вашему вопросу. Какой номер лучше: StringBuilder или HtmlGenericControl?

Лучше быть крайне туманный термин, давайте ответить на кучу несколько разных вопросов:

  1. Который один является быстрее?

    Возможно StringBuilder, учитывая, что это не имеет значения. Вообще. По сравнению с временем, затрачиваемым на загрузку изображения (скажем, две секунды, т. Е. 2 ​​000 мс), сравнение по эффективности между StringBuilder и HtmlGenericControl будет, вероятно, меньше миллисекунды. Важно ли вам тратить 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. Какой номер более доступен для чтения?

    IMO, нет. HTML-код может быть написан чистым способом, что делает его чрезвычайно читаемым. Точно так же было бы легко быть потерянным во всех вызовах встроенных элементов управления, если код является частью дерьма.

  4. Какой тип больше надежный?

    Предполагается, что платформа .NET Framework будет протестирована и особенно надежна, по крайней мере, по сравнению со средними бизнес-приложениями. Чем больше вы доверяете .NET Framework, тем лучше, если вы не знаете, как сделать лучше, и вы протестировали свой подход, представили его для парных обзоров и т. Д.

    В случае StringBuilder, проверьте свой код. Предоставление .NET Framework генерации HTML на вашем месте означает, что вы можете больше сосредоточиться на действительных объектах, которыми вы управляете, а их тестирование немного проще.

Итак, что единственное лучшее решение?

Лично, если бы я придерживался классического ASP.NET (в отличие от ASP.NET MVC), я бы создал выделенный элемент управления с HTML-шаблоном.

Если по некоторым причинам это невозможно, то pick HtmlGenericControl: он абстрагирует HTML и позволяет сосредоточиться на самих объектах.

Если у Вас были требование, чтобы писать чистый, читаемый HTML-код, HtmlGenericControl будет обузой, и вам придется выбора конкатенации или каких-шаблонных системами. Известно, что элементы управления ASP.NET генерируют не очень хороший HTML-код. Учитывая HTML-код в вашем вопросе, это ограничение не распространяется на ваш случай.

+0

@ MainMa .. Большое спасибо за красивое решение. +1 для объяснения. Спасибо ... :) –

+0

@MainMa ... Вместо использования предупреждения javascript, что еще можно использовать ??? :) Пожалуйста, дайте мне знать .. –

+1

@ Kaushik: см. Http://ux.stackexchange.com/q/42012/6729 –

Смежные вопросы