使用 MvcContrib Grid 之类的东西是在代码可读性方面倒退了一步吗? [关闭]
Posted
技术标签:
【中文标题】使用 MvcContrib Grid 之类的东西是在代码可读性方面倒退了一步吗? [关闭]【英文标题】:Is using something like the MvcContrib Grid a step backwards in code readability? [closed] 【发布时间】:2011-03-07 00:43:18 【问题描述】:我的意思是,现在我们已经朝着使用现代模板引擎尽可能多地将您的 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='row0'>", row.IsAlternate ? "-alternating" : ""))
.Render();
%>
他觉得好看,我觉得挺丑的,所以想知道更多人的看法。
【问题讨论】:
一个男人的“丑”是另一个男人的“妻子”。过于主观和开放,无法回答;这只是讨论,这里明确不鼓励讨论。投票结束。 【参考方案1】:对于设计师来说,这是代码可读性的倒退,这里没有两种意见。
从开发人员的角度来看,这取决于。有些人喜欢,有些人不喜欢。与更标准的foreach
技术相比,我个人喜欢它并且更喜欢它。为什么?
您从一个简单的<table>
和一个foreach
开始。然后一些用户说你需要处理交替的行样式。首先添加ifs
。然后另一个用户说您需要能够按给定列排序。你用另一个ifs
来处理这个问题。第三个用户要求您处理分页 => 在您的视图中还有另一个 ifs
和 foreach
。你最终得到spaghetti。
结论:为正确的目标使用正确的枪。对于简单的表格,传统的方法效果很好,但是一旦你开始做更高级的事情,就使用助手。
【讨论】:
或者你可以使用 Spark 视图引擎而忘记那些 ifs ;-) @queen3,如果没有 Intellisense,需要很长时间才能找到正确的语法。开个玩笑:-) 是的,但是 Spark 有智能感知,如果需要学习的话;虽然目前我在 VS HTML 编辑器中编辑它。 Spark 真的很简单。我自己首先使用了 MvcContrib 网格和助手。但是当我开始使用 Spark 时,我最终用纯 HTML/Spark 标记替换了所有这些(以及其他“帮助程序”)。问题是,“一旦你开始做更高级的东西”,那么助手(如网格)就会中断。很难处理复杂的嵌套标签、条件属性等。 Helpers 在 HTML 上添加抽象,它最终会泄漏。【参考方案2】:MVC Contrib Grid 看起来很吓人,因为它拥有大量的功能。它是一个为所有人做所有事情的瑞士军队级 HTML 扩展。正如其他人指出的那样,手工操作更加困难或笨拙。我记得在桌面上,编写同样笨拙的代码来配置网格和电子表格控件以获得正确的效果。
但是,如果您的需求比较适中,请自行编写。 Phil Haack 在code based repeater 上有一篇很棒的文章。还有一些更轻的Grid View Helpers 可以帮助你。这些并没有那么强大,但可能更适合您应用程序中的某些工作。
【讨论】:
【参考方案3】:我同意它不是很漂亮,但是如果您开始定义表格外观的约定,您可以开始重构扩展方法来清理它。然后它甚至会干掉你的表定义。这是一个示例(减去实际的扩展方法)。
<% 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();
%>
【讨论】:
我喜欢你的扩展!我是丹尼尔的同事。【参考方案4】:乍一看很难看,但我认为它相当简洁,并且处理了很多逻辑。例如,一个标准的 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>
我很确定我也错过了一些东西。采用传统方式,我必须跟踪行数或以某种方式知道它是否是交替行,如果我没有记录并且通常有很多 <% %>
标签来处理这些代码块。
【讨论】:
以上是关于使用 MvcContrib Grid 之类的东西是在代码可读性方面倒退了一步吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
MVCContrib,Html.Grid:如何将基于行的 id 附加到 td 标签?