Работа с ASP.NET MVC "тег суп" - PullRequest
       12

Работа с ASP.NET MVC "тег суп"

4 голосов
/ 12 февраля 2010

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

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl"         %>

<%  if (Model == null)
    {                                                                       %>
<%=     ViewData.ModelMetadata.NullDisplayText                              %>
<%  }
    else if (ViewData.TemplateInfo.TemplateDepth > 1)
    {                                                                       %>
<%=     ViewData.ModelMetadata.SimpleDisplayText                            %>
<%  }
    else
    {                                                                       %>
<%      foreach (var prop in ViewData.ModelMetadata.Properties.Where(
            pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm)))
        {                                                                   %>
<%          if (prop.HideSurroundingHtml)
            {                                                               %>
<%=             Html.Display(prop.PropertyName)                             %>
<%          }
            else
            {                                                               %>
<%              if (!String.IsNullOrEmpty(prop.GetDisplayName()))
                {                                                           %>
                    <span class="display-label">
<%=                     prop.GetDisplayName()                               %>
                    </span>
<%              }                                                           %>
                <span class="display-field">
<%=                 Html.Display(prop.PropertyName)                         %>
                </span>
<%          }                                                               %>
<%      }                                                                   %>
<%  }                                                                       %>

Ах читаемость наконец. Единственная проблема заключается в том, что way занимает много времени, чтобы сделать это вручную. Мне нужен способ автоматизировать это. Какое-то решение для форматирования кода. Возможно, макрос или надстройка Visual Studio или ...? Что вы посоветуете?

Обновление

Сейчас я планирую реорганизовать большую часть логики из моей разметки (см. Ответ Майка ниже), но в то же время я нашел более управляемый способ форматирования файлов ascx, содержащих смесь кода и HTML. Код немного более распространен таким образом, но гораздо проще сначала отформатировать код, подобный этому, и с ним гораздо проще работать.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<% 
    if (Model == null)
    {
%>
        <%= ViewData.ModelMetadata.NullDisplayText %>
<%
    }
    else if (ViewData.TemplateInfo.TemplateDepth > 1)
    {
%>
        <%= ViewData.ModelMetadata.SimpleDisplayText %>
<%
    }
    else
    {
%>
<%
        foreach (var prop in ViewData.ModelMetadata.Properties.Where(
            pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm)))
        {
            if (prop.HideSurroundingHtml)
            {
%>
                <%= Html.Display(prop.PropertyName) %>
<%
            }
            else
            {
%>
                <div class="display-row">   
<%
                if (!String.IsNullOrEmpty(prop.GetDisplayName()))
                    {
%>
                        <div class="display-label">
                            <%= prop.GetDisplayName() %>
                        </div>
<%
                }
%>
                    <div class="display-field">
                        <%= Html.Display(prop.PropertyName) %>
                    </div>
            </div>
<%
            }
        }
    }
%>

Ответы [ 3 ]

16 голосов
/ 12 февраля 2010

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

См. эту статью Роба Конери

3 голосов
/ 12 февраля 2010

При правильной модели обзора (и, при желании, с двигателем искрового обзора) теговый суп отсутствует.

В частности, если используются шаблоны.

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


«Я ищу решение для форматирования кода». => тогда вы должны проверить искру. Он 'htmlified' ваши взгляды, даже если они содержат логику.

Ваш пример в нем (без перестройки ничего) =>

<var nullText="ViewData.ModelMetadata.NullDisplayText"
     templateDepth="ViewData.TemplateInfo.TemplateDepth"
     simpleDisplayText="ViewData.ModelMetadata.SimpleDisplayText"
     props="ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))" 
     m="ViewData.Model"/>
<if condition="m==null">
  ${nullText}
</if>
<elseif condition="templateDepth>1">
  ${simpleDisplayText}
</elseif>
<else>
  <for each="var prop in props">
    <if condition="prop.HideSurroundingHtml">
      ${Html.Display(prop.PropertyName)}
    </if>
    <else>
      <span if="!string.IsNullOrEmpty(prop.GetDisplayName()" class="display-field">
        ${prop.GetDisplayName()}
      </span>
      <span class="display-field">
        ${Html.Display(prop.ProperyName)}
      </span>
    </else>
  </for>
</else>

Может быть, где-то не так, но у вас есть идея.

0 голосов
/ 12 февраля 2010

Для нашего текущего проекта мы немного очистили все if-выражения, написав хелпер HTML:

public static void WriteIf(this HtmlHelper helper, bool condition, string truePart, string falsePart)
{
     helper.ViewContext.HttpContext.Response.Write(condition ? truePart : falsePart);
}

и затем в HTML вы скажете:

<% Html.WriteIf(Model.IsTrue(), "TrueText", "FalseText"); %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...