Как мне преодолеть мои страхи перед <%%> в моей разметке ASP.Net MVC? - PullRequest
14 голосов
/ 12 декабря 2008

Итак, я полностью согласен с основными принципами ASP.NET, тестируемостью, SoC, контролем HTML ... это потрясающе. Однако, будучи новичком в этом, у меня есть огромная связь с разметкой. Я знаю, что это происходит из-за моей ненависти к классическому ASP, и я не могу не чувствовать, что вошел в сумеречную зону, когда я вижу это .

Я не знаю, какова альтернатива (могу ли я использовать элементы управления сервером, привязку данных и т. Д.?)

Ответы [ 12 ]

11 голосов
/ 12 декабря 2008

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

Например, это расширение, которое я сделал, чтобы сделать RSS-spitter-outer:)

  public static string RSSRepeater<T>(this HtmlHelper html, IEnumerable<T> rss) where T : IRSSable
    {
        StringBuilder result = new StringBuilder();

        if (rss.Count() > 0)
        {
            foreach (IRSSable item in rss)
            {
                result.Append("<item>").Append(item.GetRSSItem().InnerXml).Append("</item>");
            }
        }

        return result.ToString();
    }

Так что в моем интерфейсе все, что у меня есть, это <%=Html.RSSRepeater(mydata)%>, что намного лучше.

7 голосов
/ 12 декабря 2008

1) Помощники уменьшают шум HTML
2) Частичные представления для разбиения больших страниц / повторного использования кода вида
3) Попробуйте другой движок рендеринга, например Sparkline
4) РЕФАКТОР, если ваше мнение содержит слишком много if утверждений.

4 голосов
/ 12 декабря 2008

Как избежать супа-тега чтение может быть полезным. Как правило, вы не можете использовать серверные элементы управления (хотя некоторые могут работать), нет обратной передачи или состояния просмотра. Я не думаю, что вы можете использовать привязку данных (опять же, могут быть исключения, я не уверен, как ASP.NET MVC обрабатывает серверные элементы управления в представлении.) - самый простой способ «привязать данные» к чему-либо - передать список или массив данных в представление и используйте foreach для построения из него HTML.

1 голос
/ 26 января 2009

Я хотел бы взглянуть на некоторые другие доступные движки View, лично мне действительно нравится Spark View engine , но есть много других.

Скотт Хансельман сделал отличную публикацию, глядя на искру и Nhaml с некоторыми фрагментами разметки, на которые вы можете посмотреть, чтобы убедиться, что она соответствует вашей астетике:)

http://www.hanselman.com/blog/TheWeeklySourceCode30SparkAndNHamlCrazyASPNETMVCViewEngines.aspx

1 голос
/ 25 января 2009

Мне нравится делать подсветку синтаксиса для моих тегов "<%%>" очень похожей на цвет фона. Я использую черный фон и серебристый цвет (у меня нет специального цвета под рукой) для моих тегов <%%>. Это плюс другие предложения здесь должны сделать ваш код более читабельным. Конечно, вы всегда можете попробовать другой механизм просмотра (в этом вся прелесть MVC!)

1 голос
/ 12 декабря 2008

Переместить некоторые (не все, только в тех случаях, когда это имеет смысл) отображать логику (например, ваши даты) в вашей модели. Например, в вашем примере вы можете добавить строковое свойство Task.DisplayDate, которое обрабатывает вызов .ToShortDateString (). Затем, если это когда-либо изменится, вы измените все это в одном месте, и это сократит код в представлении.

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

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

Помогает и то, что сказали другие: используйте частичные представления и строгую печать.

0 голосов
/ 11 октября 2010

Ну, теперь вы можете попробовать Razor (в ASP.NET MVC 3)

Я просто надеюсь, что "@" тебя тоже не испугает: P

0 голосов
/ 25 января 2009

Я бы посоветовал взглянуть на шаблонизатор Velocity, который использовал MonoRails. ASP.NET MVC очень точно моделирует себя в формате MonoRails, поэтому использовать шаблоны Velocity довольно просто.

Нажмите здесь, чтобы узнать больше .

0 голосов
/ 25 января 2009

Очень редко используются вспомогательные методы (я НЕ говорю о вспомогательных методах расширения) для написания HTML-кода в самом представлении с использованием объектной модели Html. Я бы не рекомендовал это, если у вас нет странной логики, которую вы не можете легко написать в представлении. Пока код в .aspx.cs является кодом VIEW, тогда все в порядке.

В файле .aspx вашего View:

 <%-- render section --%>
 <% RenderTextSection(section); %>

В вашем коде View вы используете HtmlGenericControl для создания HTML, а затем следующую строку для его записи:

htmlControl.RenderControl(new HtmlTextWriter(Response.Output));

Мой полный метод:

protected void RenderTextSection(ProductSectionInfo item)

    {
        HtmlGenericControl sectionTextDiv = new HtmlGenericControl("div");

        bool previousHasBulletPoint = false;
        System.Web.UI.HtmlControls.HtmlControl currentContainer = sectionTextDiv;

        foreach (var txt in item.DescriptionItems)
        {
            if (!previousHasBulletPoint && txt.bp)
            {
                // start bulleted section
                currentContainer = new HtmlGenericControl("UL");
                sectionTextDiv.Controls.Add(currentContainer);
            }
            else if (previousHasBulletPoint && !txt.bp)
            {
                // exit bulleted section
                currentContainer = sectionTextDiv;
            }

            if (txt.bp)
            {
                currentContainer.Controls.Add(new HtmlGenericControl("LI")
                {
                    InnerHtml = txt.t
                });
            }
            else
            {
                currentContainer.Controls.Add(new HtmlGenericControl()
                {
                    InnerHtml = txt.t
                });
            }

            previousHasBulletPoint = txt.bp;
        }

        sectionTextDiv.RenderControl(new HtmlTextWriter(Response.Output));
    }
0 голосов
/ 25 января 2009

используйте на стороне сервера комментарии <%-- comment --%> для разделения блоков и повышения читабельности. используйте дополнительный межстрочный интервал и для разделения блоков (похоже, SO почему-то убивает мой межстрочный интервал).

        <%-- Go through each testimonial --%>
        <% foreach (var testimonial in ViewData.Model.Testimonials) { %>

        <div class="testimonialFrame">
            <div class="testimonialHeader"><%= testimonial.summaryText %></div>


            <%-- Show video if available --%>
            <% if (string.IsNullOrEmpty(testimonial.Video.FullURL) == false) { %>

            <div  style="padding-top:12px">
                <% Html.RenderAction("YouTubeControl", "Application", new { youTubeId = testimonial.Video.FullURL }); %>
            </div>

            <% } %>

            <div class="roundedBox" style="margin-top:15px">
                <div id="txtTestimonialText" class="testimonialText paddedBox"><%= testimonial.TestimonialText %></div>
            </div>

            <div class="testimonialFooter"><%= testimonial.name %></div>
        </div>

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