ASP.NET. MVC 2 C #: столько пробелов - PullRequest
0 голосов
/ 08 декабря 2010

Есть раздел моего кода, который представляет собой смесь между <% %> операторами и HTML ... исходный вид ужасен.Есть так много пробелов, что заставляет меня задыхаться от отвращения.

Что я могу с этим поделать?

<!-- START Content -->
  <div class="divFilterWrap">

            <img src="/Content/Images/filterMainCuisineHeader.gif" />

            <ul>
            <% int count = 1; %>
            <% foreach (var filter in Model.Filter)
               { %>

               <% if (filter.GroupOrder == count) {
                  } else { %>

                    <% count++; %>

                    </ul>
                    <% switch (filter.GroupLabel)
                       { %>

                       <% case "Main Cuisine": %>
                       <img src="/Content/Images/filterMainCuisineHeader.gif" width="175" height="30" />
                       <% break; %>

                       <% case "Dining Style": %>
                       <img src="/Content/Images/filterDiningStyleHeader.gif" width="175" height="30" />
                       <% break; %>

                       <% case "Price Range": %>
                       <img src="/Content/Images/filterPriceRangeHeader.gif" width="175" height="30" />
                       <% break; %>

                    <% } %>
                    <ul>

               <% } %>

               <% if (filter.TagCount > 0) { %>

                    <% if (filter.TagChecked == 1) { %>

                        <li class="checked"><%: filter.TagLabel %> (<%: filter.TagCount %>) <span class="closeImage"><img src="/Content/Images/filterButtonClose.gif" /></span></li>

                    <% } else { %>

                        <li><%: filter.TagLabel %> (<%: filter.TagCount %>)</li>

                    <% } %>

                <% } %>

            <% } %>
            </ul>

  </div><!-- END Content -->

Где находится код C #, это место резервируется при просмотре исходного кода.А вот как это выглядит:

<!-- START Content -->
  <div class="divFilterWrap">

            <img src="/Content/Images/filterMainCuisineHeader.gif" />

            <ul>


                        <li>Coffee / Tea House (1)</li>



                    </ul>

                       <img src="/Content/Images/filterDiningStyleHeader.gif" width="175" height="30" />

                    <ul>



                        <li>Casual Dining (1)</li>



                    </ul>

                       <img src="/Content/Images/filterPriceRangeHeader.gif" width="175" height="30" />

                    <ul>



                        <li>$8 to $15 (1)</li>


            </ul>

  </div><!-- END Content -->

GROSS!

Ответы [ 7 ]

4 голосов
/ 08 декабря 2010

Включите сжатие GZIP в IIS.Эффекты пробела в HTML значительно уменьшаются при сжатии GZIP.

См., Например: http://www.kwaree.com/blog/2009/11/27/how-to-remove-whitespace-from-html-code/

"Удаление пробелов не стоит. Любое достойное занятиеВеб-сервер настроен на использование кодировки «gzip» для обслуживания html-документов. Пробелы легко сжимаются и не будут существенно изменять объем данных, используемых при обслуживании документа. Хотя конечный результат будет меньше, он не будетпочти такой же большой выигрыш, как можно предположить при случайном наблюдении. "

2 голосов
/ 08 декабря 2010

хорошо, вы делаете ряд ошибок. Причина, по которой у вас так много пробелов, заключается в том, что вы помещаете каждый блок кода C # в новую строку. Вам не нужно делать это. Посмотрите на мои изменения:

<img src="/Content/Images/filterMainCuisineHeader.gif" />
<ul>
<% int count = 1;
    foreach (var filter in Model.Filter)
    {
        if (filter.GroupOrder == count) {
        } else {
            count++; %>
        </ul>
        <% switch (filter.GroupLabel)
           { 
               case "Main Cuisine": %>
           <img src="/Content/Images/filterMainCuisineHeader.gif" width="175" height="30" />
           <% break; 
               case "Dining Style": %>
           <img src="/Content/Images/filterDiningStyleHeader.gif" width="175" height="30" />
           <% break;
               case "Price Range": %>
           <img src="/Content/Images/filterPriceRangeHeader.gif" width="175" height="30" />
           <% break;
           } %>
           <ul>
        <% }
        if (filter.TagCount > 0) {
            if (filter.TagChecked == 1) { %>
            <li class="checked"><%: filter.TagLabel %> (<%: filter.TagCount %>) <span class="closeImage"><img src="/Content/Images/filterButtonClose.gif" /></span></li>
            <% } else { %>
            <li><%: filter.TagLabel %> (<%: filter.TagCount %>)</li>
            <% }
        } 
    } %>
</ul>

Вы видите, как я удалил тонну из ваших <% и %> и соединенных кодовых блоков вместе

1 голос
/ 08 декабря 2010

Вы можете использовать модуль HTTP для удаления пробелов.У Мадса Кристенсена есть один: http://madskristensen.net/post/A-whitespace-removal-HTTP-module-for-ASPNET-20.aspx

1 голос
/ 08 декабря 2010

много вещей.Вы можете просто удалить пробел ... несколько пробелов не имеют значения в C # или HTML.

Или вы можете переписать свой вид, чтобы использовать модель представления DTO, тесно связанную со структурой страницы, поэтомуВы генерируете предварительно отформатированные фрагменты и визуализируете частичные элементы управления вместо какой-либо сложной логики элементов управления в коде своей страницы?

Если вы хотите опубликовать свой источник, я уверен, что есть способы устранить пробелы, если вы действительно хочу.Но вам, вероятно, лучше просто игнорировать это.:)

РЕДАКТИРОВАТЬ: ОК, попробуйте это.Используйте выделенную модель представления, чтобы ваш контроллер мог назначать такие вещи, как URL-адреса изображений в логике контроллера, а не переходить в коде страницы.

<img src="/Content/Images/filterMainCuisineHeader.gif" />
<ul>
    <% 
    int count = 1;
    foreach (var filter in Model.Filter) {
         if (filter.GroupOrder != count) {
            count++; 
    %></ul>
           <img src="<%=filter.ImageUrl%>" width="175" height="30" />
        <ul>
       <% 
    }
    if (filter.TagCount > 0) { %>
            <li class="<%=filter.CssClass%>">
                <%: filter.TagLabel %> (<%: filter.TagCount %>) 
                <span class="closeImage">
                   <img src="/Content/Images/filterButtonClose.gif" /></span>
            </li><%
       } 
    } 
    %></ul>
</div><!-- END Content -->

Вам понадобится Model.Filter для IEnumerable, который выглядит следующим образом:

public class FilterViewData {
    public int GroupOrder { get; set; }
    public int TagCount { get; set; }
    public string CssClass { get; set; }
    public string ImageUrl { get; set; }
    public string TagLabel { get; set; }
}
  • что-то вроде AutoMapper может оказаться очень полезнымпри заполнении объектов представления данных.

В этом примере вы также создадите правило CSS, например:

li.unchecked span.closeImage { display: none; }

, чтобы не показывать диапазон closeImage и изображениевнутри непроверенных элементов списка.

Помогает ли это?

0 голосов
/ 08 декабря 2010

Чтобы прокомментировать мой комментарий к @Alastair Pitts, (вики, потому что я просто хочу показать форматированный пример), я вполне уверен, что именно пробел между вашими HTML и тегами ASP.Net является настоящим виновником, поэтому начнемс чем-то вроде этого, вероятно, будет выглядеть лучше, когда вы просматриваете исходный код (но ему не хватает чего-то, что касается читабельности в Visual Studio):

<img src="/Content/Images/filterMainCuisineHeader.gif" />
<ul><%
int count = 1;
foreach (var filter in Model.Filter) {
  if (filter.GroupOrder != count)
  {
  }
  else
  {
    count++; 
%></ul><%
    switch (filter.GroupLabel)
    { 
      case "Main Cuisine":
  %><img src="/Content/Images/filterMainCuisineHeader.gif" width="175" height="30" /><%
        break; 
      case "Dining Style":
  %><img src="/Content/Images/filterDiningStyleHeader.gif" width="175" height="30" /><%
        break;
      case "Price Range":
  %><img src="/Content/Images/filterPriceRangeHeader.gif" width="175" height="30" /><%
        break;
    }
%><ul><%
  }

  if (filter.TagCount > 0)
  {
    if (filter.TagChecked == 1)
    {
  %><li class="checked"><%: filter.TagLabel %> (<%: filter.TagCount %>)
    <span class="closeImage">
      <img src="/Content/Images/filterButtonClose.gif" />
    </span>
  </li><%
    }
    else
    {
  %><li><%: filter.TagLabel %> (<%: filter.TagCount %>)</li><%
    }
  }
}
%></ul>
0 голосов
/ 08 декабря 2010

Рассмотрим несколько конструктивных моментов улучшения:

  • слишком много экранирования в коде и HTML.
 <ul>
 <% int count = 1;   
   foreach (var filter in Model.Filter)
   { 
      if (filter.GroupOrder != count) 
      { 
           count++; %>
  • у вас есть логика в вашем представлении. Попробуйте переместить эту логику обратно в контроллер. Ваша модель должна иметь свойство с именем GroupLabelImage, а switch принадлежит контроллеру. Затем вы должны выписать изображение только один раз.

  • все расчеты следует перенести на контроллер.

0 голосов
/ 08 декабря 2010

Рассмотрите этот пример в своем источнике:

        <ul>
        <% int count = 1; %>
        <% foreach (var filter in Model.Filter)

Это много ложных пробелов после <ul> (отступ для тегов вашего сервера).Вы могли бы переписать его как:

        <ul>
<% int count = 1; %>
<% foreach (var filter in Model.Filter)

и принять стиль, в котором серверные теги всегда начинаются на строке.ИМО, хотя это того не стоит - я бы пошел с решением @ Hightechrider.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...