Является ли использование чего-то вроде Grid MvcContrib шагом назад в удобочитаемости кода?
Я имею в виду, что теперь у нас есть все это движение к тому, чтобы максимально отделить вашу HTML-разметку от вашего кода с помощью современных шаблонизаторов (в старые времена программисты обычно просто сохраняли конкатенацию строк в php, что было ужасно).
Затем я смотрю на код сотрудника для создания HTML-таблицы, и это выглядит так:
<% Html.Grid(Model).Columns(column => {
column.For(x => Html.ActionLink("Edit", "Edit", new { id = x.Id })).Attributes(width => "30px").DoNotEncode();
column.For(x => Html.ActionLink("Delete", "Delete", new { id = x.Id }, new { @class = "delete" })).Attributes(width => "95px").DoNotEncode();
column.For(x => x.Id).Named("Code");
column.For(x => x.Name).Named("Name").HeaderAttributes(align => "left");
column.For(x => x.CPF).Named("CPF");
})
.Attributes(width => "100%", border => "0", cellpadding => "0", cellspacing => "0", @class => "data-table")
.Empty("No users found!")
.RowStart(row => string.Format("<tr class='row{0}'>", row.IsAlternate ? "-alternating" : ""))
.Render();
%>
Он думает, что это круто, я думаю, что это довольно уродливо, поэтому я хотел бы узнать мнение большего количества людей.
4 ответа
Для дизайнера это шаг назад в удобочитаемости кода, здесь нет двух мнений.
С точки зрения разработчика это будет зависеть. Некоторым это нравится, другим нет. Лично мне это нравится и я предпочитаю это по сравнению с более стандартным foreach
техника. Зачем?
Вы начинаете с простого <table>
и foreach
, Затем какой-то пользователь говорит, что вам нужно обрабатывать чередующиеся стили строк. Вы начинаете с добавления ifs
, Затем другой пользователь говорит, что вы должны иметь возможность сделать заказ по данному столбцу. Вы справляетесь с этим с еще одним ifs
, Третий пользователь просит вас обработать пейджинг => еще один ifs
а также foreach
по вашему мнению. Вы заканчиваете со спагетти.
Вывод: используйте правильный пистолет для правильной цели. Для простых таблиц обычный подход работает хорошо, но как только вы начинаете делать более сложные вещи, используйте помощников.
MVC Contrib Grid выглядит пугающе только потому, что обладает огромными возможностями. Это расширение HTML класса швейцарской армии, делающее все для всех людей. Как отмечали другие, делать это вручную еще сложнее или неуклюже. Я помню, как на рабочем столе писал одинаково неуклюжий код для настройки сетки и элементов управления электронными таблицами, чтобы получить нужные эффекты.
Однако, если ваши потребности скромнее, просто напишите свои. У Фила Хаака была отличная статья о репитере на основе кода. Есть также несколько более легких помощников Grid View, которые могут вам помочь. Они не так мощны, но могут быть более подходящими для определенных задач в вашем приложении.
Я согласен, что это не очень красиво, но если вы начнете определять соглашения о том, как должна выглядеть таблица, вы можете начать рефакторинг к методам расширения, чтобы очистить это. Тогда это даже высушит ваши определения таблиц. Вот пример (минус фактические методы расширения).
<% Html.Grid(Model).Columns(column => {
InsertEdit(column).Width(30);
InsertDelete(column).Width(95);
column.For(x => x.Id).Named("Code");
column.For(x => x.Name).Named("Name").LeftAlignHeader();
column.For(x => x.CPF).Named("CPF");
})
.ApplyDefaultStyle()
.Class("data-table")
.Empty("No users found!")
.DefaultAlternatingStyle()
.Render();
%>
На первый взгляд это некрасиво, но я думаю, что оно довольно лаконично и требует много логики. Например, стандартный вывод MVC, чтобы сделать что-то близкое к этому (без разметки)
<table>
<% dim index as integer = 0
if model.count > 0 then %>
<tr>
<th>Edit</th>
<th>Delete</th>
<th>Code</th>
<th align="left">Name</th>
<th>CFP</th>
for each item in model
if index mod 2 = 0 then%>
<tr>
<%else%>
<tr class ="alternate">
<%end if%>
<td><%= html.actionLink("Edit", "Edit", New With {.id = item.id})%></td>
<td><%= html.actionLink("Delete", "Delete", New With {.id = item.id})%></td>
<td><%: item.id%></td>
<td><%: item.Name%></td>
<td><%: item.CPF%></td>
<% index += 1
Next%>
<%Else%>
<tr><td>No Rows Found</td></tr>
<%end if%>
</table>
И я почти уверен, что там тоже кое-что пропустил. Следуя традиционным правилам, я должен отслеживать количество строк или какой-либо способ узнать, является ли это чередующейся строкой или нет, есть случай, когда у меня нет записей и, как правило, много <% %>
теги для обработки этих блоков кода.