我创造了有史以来最糟糕的标签汤(ASP.NET MVC 2)

时间:2010-11-09 19:10:23

标签: asp.net asp.net-mvc asp.net-mvc-2

我正盯着最糟糕的一塌糊涂,我的显示器不够高,无法看到发生的事情,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 个答案:

答案 0 :(得分:8)

让我们从最初由Rob Conery提出的格言开始:如果在视图中某处嵌入了“if”,则可能表明您应该创建一个HtmlHelper或B.)从中撤消逻辑视图并将其插入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>

此时,如果有可能在其他某个页面中使用此UI,则应考虑将其放入用户控件中。通过这样做,您的视图现在看起来像这样:

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

最终,只要你的View开始看起来像汤,那是因为你的观点在做太多的思考。反过来,这意味着:您的应用程序的某些其他层没有足够的思考。通过查看视图中的逻辑,并确定哪些抽象可能有助于您保持DRY,您的视图将变得更具可读性和更易于维护。

答案 1 :(得分:2)

我会将一些内联逻辑考虑到HtmlHelperExtension方法,然后创建一个DisplayTemplate“Friend”

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

你的DisplayTemplate“朋友”看起来像这样:

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

您可以创建更多的DisplayTemplates并专门调用它们,而不是制作HtmlHelperExtensions:DisplayFor("BookReview", friend)

答案 2 :(得分:1)

首先我要说的是,我们都去过那里......

对于您的特定问题,我会考虑以下几个“工具”:

  1. 部分视图:例如,当您拥有大量嵌套<div>标记时,您可能需要考虑在适当的时候创建一些部分视图。
  2. 使用Controller for Business Logic :您的一些逻辑应该在控制器中完成,在那里更容易分解并调用不同的辅助方法来应用逻辑。考虑将一个自定义对象(如果愿意的话,ViewModel)传递给您的视图,该对象具有解析的所有业务逻辑。例如,显示“quote”与“quotes”之类的内容可以在ViewModel对象的“DisplayValue”类型属性中完成。
  3. HTML帮助程序:这些小扩展程序可以帮助您将多个if / else语句提取到一个易于阅读的方法中 - 如果一般编写,它们可以在其他页面上重复使用够了。
  4. 最后,我会说,去寻找一些新鲜空气,回想一下只有一件事:简化!我们经常会遇到一大堆需要完成的任务,而且我们会在自己的汤或意大利面或者你有什么中迷失。你需要在只考虑重构的情况下处理代码,直到它足够干净,你可以知道下一个逻辑应该去哪里。

答案 3 :(得分:1)

我是ASP.Net MVC的新手,所以我也尝试为我找到编码约定:

  • 写&lt; %%&gt;标签在一个单独的行中(&lt;%:和&lt;%=)

  • 除外
  • 消除%&gt;&lt;%的序列(&lt;%:和&lt;%=除外)

  • 将C#和HTML缩进分开

  • 缩进&lt;%=和&lt;%:好像他们在HTML标签的位置(如果他们代表HTML标签)

答案 4 :(得分:0)

我不是ASP专家,但是在PHP中有没有办法回应事情?代替使用这么多开放和关闭标签?我应该将所有内容放在代码上方,并创建您在HTML中使用的变量吗?

答案 5 :(得分:0)

在我看来,这并不可怕。我认为这里的关键是尝试花一些时间浏览它并评论块开始的位置,然后是相应的结束标记。现在会很痛苦,但以后会节省你一些时间。

答案 6 :(得分:0)

我假设您正在寻找代码审核。在那种情况下:

  1. 删除空的ELSE块,注释为“nothing,it appear”
  2. 将嵌套的IF条件合并为单个检查IF(计数!= 0&amp;&amp; count&lt; 5)