Я создал худший суп с тегами за все время (ASP.NET MVC 2) - PullRequest
3 голосов
/ 09 ноября 2010

Я смотрю на самый ужасный беспорядок, мой монитор недостаточно высок, чтобы видеть, что происходит, и VS 2010 ничем не помогает.

Я не имею ни малейшего представления, как изменить этот мусор.

Сейчас 11 утра, и мне уже хочется наливать напиток.

Это только последнее доказательство того, что у меня нет бизнес-кодирования? Будь честным.

<div id="followedFriends">
    <% if (Model.FollowedFriends.Count() > 0)
       {
           foreach (var friend in Model.FollowedFriends)
           { %>
    <div id="friendContainer">
        <div class="followedFriend">
            <div class="userName">
                <%= Html.ActionLink(friend.FoFriend.UserName, "Visitor", "Home", new {userID = friend.FoFriend.UserId}, null)%></div>
            Currently reading:
            <br />
            <div class="bookLinks">
                <% if (friend.BookCount != 0)
                   { %>
                <% if (friend.BookCount <= 5)
                   { %>
                <%= friend.BookLinks%>
                <%}
                   else
                   { %>
                <%:Html.ActionLink(friend.BookCount + " different books.", "Visitor", "Home", new {userID = friend.FoFriend.UserId}, null)%>
                <%}
                   }
                   else
                   { %>
                Nothing, it appears...
                <%}%>
            </div>
            <%if (friend.ReviewCount != 0)
              {%>
            New review for:
            <div class="reviewLinks">
                <%if (friend.ReviewCount <= 5)
                  { %>
                <%= friend.ReviewLinks%>
                <%}
                  else
                  {%>
                <%: friend.ReviewCount %>
                different books
                <%}%></div>
            <%}

              if (friend.QuoteCount != 0)
              {%>
            <span class="highlight">&#9656</span>
            <%: friend.QuoteCount%>
            new
            <%if (friend.QuoteCount != 1)
              { %>quotes
            <%}
              else
              { %>
            quote
            <%} %>
            <%}%>
        </div>
    </div>
    <%}
       }%>
</div>
<%} %>

Обновление

Так как кто-то спрашивал, вот соответствующая часть модели представления:

 public class FollowedFriend
    {
        public aspnet_User FoFriend { get; set; }
        public string BookLinks { get; set; }
        public int BookCount { get; set; }
        public string ReviewLinks { get; set; }
        public int ReviewCount { get; set; }
        public int QuoteCount { get; set; }

        public FollowedFriend(Guid userID, DateTime lastVisit)
        {
            using (var context = new BookNotesEntities())
            {
                FoFriend = context.aspnet_Users.SingleOrDefault(u => u.UserId == userID);
                var reading = context.Books.Where(b => b.UserID == userID && b.CurrentlyReading == true).ToList();
                BookCount = reading.Count;
                if (BookCount <= 5)
                    BookLinks = Book.ConvertBooksToLinks("Book/Details", reading);
                else
                    BookLinks = "";
                var recentBooks = context.Books.Where(b => b.UserID == userID
                    && b.Review.DateCreated >= lastVisit).OrderByDescending(b => b.DateCreated).ToList();
                if (recentBooks.Count <= 5)
                    ReviewLinks = Book.ConvertBooksToLinks("/Book/Details", recentBooks);
                else
                    ReviewLinks = "";
                ReviewCount = recentBooks.Count;
                QuoteCount = context.Quotes.Count(q => q.UserID == userID && q.DateCreated >= lastVisit);
            }
        }
    }

Ответы [ 7 ]

8 голосов
/ 09 ноября 2010

Давайте начнем с максимы, которая была первоначально предложена Робом Конери: если где-то в вашем представлении есть встроенное «если», это, вероятно, показатель того, что вам следует либо: а) создать HtmlHelper или б) убрать логикупредставление и вставьте его в вашу ViewModel.

Сделав так, вы можете очистить ваш View, чтобы он выглядел примерно так (вы поняли):

   <div id="followedFriends">
        <% foreach (var friend in Model.FollowedFriends) { %>
        <div id="friendContainer">
            <div class="followedFriend">
                <div class="userName">
                    <%: Html.ActionLink(friend.FoFriend.UserName, "Visitor", "Home", new {userID = friend.FoFriend.UserId}, null)%>
                </div>
                Currently reading:

                <br />
                <div class="bookLinks">
                    <%: Html.DisplayBooklinks(friend) %>
                </div>
                <div class="bookReviews">
                    <%: Html.DisplayBookReviews(friend) %>
                </div>
                <div class="bookQuotes">
                    <%: Html.DisplayQuotes(friend) %>
                </div>
            </div>
        </div>
        <% } %>
    </div>

На этом этапе,если есть вероятность, что этот фрагмент пользовательского интерфейса может быть использован на какой-либо другой странице, вам следует рассмотреть возможность добавления его в пользовательский элемент управления.Таким образом, ваш взгляд теперь может выглядеть примерно так:

<% Html.RenderPartial("FriendDetails", Model.FollowedFriends); %>

В конечном счете, когда ваш вид начинает выглядеть как суп, это потому, что ваш взгляд слишком много думает.Что, в свою очередь, означает: какой-то другой уровень вашего приложения недостаточно продуман.Путем точного определения логики в ваших представлениях и определения того, какие абстракции могут помочь вам в вашей попытке остаться СУХИМ, ваши представления станут намного более читабельными и гораздо более удобными для обслуживания.

2 голосов
/ 09 ноября 2010

Я бы преобразовал часть этой встроенной логики в метод HtmlHelperExtension, а затем создал бы DisplayTemplate "Friend"

<div id="followedFriends">
    <% if (Model.FollowedFriends.Any()) {
        foreach (var friend in Model.FollowedFriends) {
            <%=Html.DisplayFor(friend) %>
       <% } %>
    <% } %>
</div>

И ваш DisplayTemplate "Friend" будет выглядеть примерно так:

<div id="friendContainer">
    <div class="followedFriend">
        <div class="userName">
            <%= Html.ActionLink(friend.FoFriend.UserName, "Visitor", "Home", new {userID = friend.FoFriend.UserId}, null)%></div>
            Currently reading:
            <br />
            <%=Html.BookInformation(friend) %>
            <%=Html.BookReview(friend) %>
            <%=Html.Quotes(friend) %>
        </div>
    </div>
</div>

Вместо создания HtmlHelperExtensions вы можете просто создать больше DisplayTemplates и специально вызывать их: DisplayFor("BookReview", friend)

1 голос
/ 09 ноября 2010

Я новичок в ASP.Net MVC, поэтому я тоже пытаюсь найти для себя соглашения по кодированию:

  • написать <%%> теги в отдельной строке (кроме <%: и <% =) </p>

  • исключить последовательности%> <% (кроме <%: и <% =) </p>

  • разделять отступы C # и HTML

  • отступ <% = и <%: как если бы они были тегами HTML (если они <em>делают представляют теги / теги HTML)

1 голос
/ 09 ноября 2010

Позвольте мне начать с того, что мы все были там ...

Для вашей конкретной проблемы я бы рассмотрел несколько из следующих "инструментов":

  1. Частичные представления : например, если у вас много вложенных тегов <div>, вы можете рассмотреть возможность создания некоторых частичных представлений, где это необходимо.
  2. Использование контроллера дляБизнес-логика : часть вашей логики должна быть реализована в контроллере, где проще разбить вещи и вызвать различные вспомогательные методы для применения логики.Подумайте о том, чтобы передать вашему представлению пользовательский объект (если хотите, ViewModel), в котором проанализирована вся бизнес-логика.Например, такие вещи, как отображение «кавычек» и «кавычек», могут быть выполнены в свойстве типа DisplayValue объекта ViewModel.
  3. HTML Helpers : эти небольшие расширения могут помочь позаботитьсяИзвлечение многих операторов if / else, которые у вас есть, в легко читаемый метод - и они могут быть повторно использованы на других страницах, если написано достаточно.

Наконец, я бы сказал, иди, возьми несколькоподышать свежим воздухом и вернуться только с одной целью: упростить!Часто мы сталкиваемся с длинным списком задач, которые необходимо выполнить, и теряемся в нашем собственном супе, спагетти или чем-нибудь еще.Вам нужно будет подходить к коду только с учетом рефакторинга, пока он не станет достаточно чистым, чтобы вы могли определить, куда должен идти следующий фрагмент логики.

0 голосов
/ 09 ноября 2010

Я предполагаю, что вы ищете обзор кода.В этом случае:

  1. удалить пустой блок ELSE с комментарием «ничего не появляется»
  2. Объединить вложенные условия IF в одну проверку IF (count! = 0 && count<5) </li>
0 голосов
/ 09 ноября 2010

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

0 голосов
/ 09 ноября 2010

Я не эксперт по ASP, но, как и в PHP, нет способа повторить вещи?Вместо того, чтобы использовать так много открытых и закрытых тегов?Я должен поместить все выше кода и сделать переменные, которые вы используете в вашем HTML?

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