Как мне преодолеть мои опасения по поводу <%%> в моей разметке ASP.Net MVC?
Итак, я полностью покупаю базовые активы ASP.NET, тестируемость, SoC, управление HTML... это потрясающе. Однако, будучи новичком, у меня есть огромная зависания с разметкой. Я знаю, что это происходит из-за моей ненависти к классическому ASP, и я не могу не чувствовать, что я вошел в зону сумерек, когда Я вижу это.
Я не знаю, что такое альтернатива (могу ли я использовать серверные элементы управления, привязку данных и т.д.??)
Ответы
Ответ 1
Есть вещи, которые вы можете сделать, чтобы помочь очистить разметку, но я согласен, что это может немного похмелить.
- Вы можете сделать свои собственные HTML-помощники для вывода данных с использованием методов расширения, чтобы вы могли скрыть некоторые логики if/else, итерация и т.д.
- S введите ваши виды, чтобы вы могли сделать
ViewData.Model.myProperty
, а не (MyClasst)ViewData["foo"].myProperty
Например, это расширение, которое я сделал для создания RSS-spitter-external:)
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)%>
, что намного приятнее.
Ответ 2
1) Помощники уменьшают шум HTML
2) Частичные виды для разбивки больших страниц/кода повторного использования
3) Попробуйте использовать другой механизм рендеринга, например Sparkline
4) REFACTOR, если в вашем представлении слишком много операторов if
.
Ответ 3
Избегайте использования суп-тега, возможно, будет полезно. Как правило, вы не можете использовать серверные элементы управления (некоторые из них могут работать), нет обратной передачи или viewstate. Я не думаю, что вы можете использовать привязку данных (опять же могут быть исключения, я не уверен, как ASP.NET MVC рассматривает серверные элементы управления в представлении.) - самый простой способ "databind" - передать список или массив данных в представление и использовать foreach для создания HTML из него.
Ответ 4
Переместите некоторые (не все, только в случаях, когда это имеет смысл) логику отображения (например, даты) в вашу модель. Например, в вашем примере вы можете добавить свойство строки Task.DisplayDate, которое обрабатывает вызов .ToShortDateString(). Затем, если он когда-либо изменится, вы измените его все в одном месте и сократите код в представлении.
HTML-помощники хороши, иногда. Мне не очень нравится иметь мой HTML в конкатенированных строках или StringBuilder в каком-то классе, но если вы делаете что-то много, что работает с множеством разных наборов данных, они не так уж плохи.
Я бы также изменил ваши настройки форматирования кода С#, чтобы иметь скобки в одной строке. Это сокращает беспорядок. К сожалению, у вас нет отдельных настроек для этого редактора кода и редактора HTML, поэтому вам тоже придется привыкнуть к нему в вашем коде. Это не самое худшее в мире.
То, что говорят другие, также помогает: использовать частичные представления и сильную типизацию.
Ответ 5
Мне нравится выделять синтаксис для тегов "<%% > ", очень похожих на цвет фона. Я использую черный фон и цвет серебристо-иш (не имеют цвета цвета под рукой) для моих тегов "<%% > ". Это плюс другие предложения здесь должны сделать ваш код более читаемым. Конечно, вы всегда можете попробовать другой механизм просмотра (что красота MVC!)
Ответ 6
Я бы посмотрел на некоторые из доступных доступных движков View, мне лично очень нравится Spark view engine, но есть много других.
Скотт Гензельм сделал замечательную статью, в которой искал искру, и Nhaml с некоторыми фрагментами разметки, которые вы можете посмотреть, астетика:)
http://www.hanselman.com/blog/TheWeeklySourceCode30SparkAndNHamlCrazyASPNETMVCViewEngines.aspx
Ответ 7
Если вы нажмете ctrl + z после его форматирования, он просто отменяет форматирование, а не ввод.
Мне кажется, что это полезно, чтобы сохранить первую скобку в той же строке, что и оператор if
Ответ 8
Если вы говорите о HTML из обработанных элементов управления, я боюсь, что это не улучшится, потому что у вас есть хорошая стандартная оболочка вокруг вашего представления в MVC. Без адаптированных элементов управления выходной сигнал по-прежнему находится в скриншоте в виде таблицы вложенных таблиц в 1995 г.
Спасибо, Microsoft!
Ответ 9
используйте на стороне сервера комментарии <%-- comment --%>
для разделения блоков и повышения удобочитаемости. используйте дополнительный интервал между отдельными блоками (похоже, по какой-то причине, похоже, убивает мой межстрочный интервал).
<%-- 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>
<% } %>
Ответ 10
Очень редко используйте вспомогательные методы (я не говорю о методах вспомогательного расширения) для написания HTML-кода в самом представлении с использованием объектной модели Html. Я бы не recomment это, если у вас нет какой-то wierd логики, которую вы не можете легко написать в представлении. Пока код в .aspx.cs - это код VIEW, то его штраф.
В вашем файле View.aspx:
<%-- render section --%>
<% RenderTextSection(section); %>
В вашем представлении "codebehind" вы используете 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));
}
Ответ 11
Я бы предложил посмотреть на механизм моделирования Velocity, который использовал MonoRails. ASP.NET MVC очень сильно моделирует формат MonoRails, поэтому использование шаблонов Velocity довольно просто.
Нажмите здесь, чтобы узнать больше.
Ответ 12
Теперь вы можете попробовать Razor (в ASP.NET MVC 3)
Я просто надеюсь, что "@" тоже не испугает вас: P