使用类似MvcContrib Grid的东西在代码可读性方面倒退了吗?

dan*_*iel 6 asp.net-mvc coding-style 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();
%>
Run Code Online (Sandbox Code Playgroud)

他认为这很棒,我认为这很难看,所以我想知道更多人的意见.

Dar*_*rov 5

对于设计师而言,它在代码可读性方面倒退了一步,这里没有两个意见.

从开发人员的角度来看,这将取决于.有些人喜欢别人没有.我个人喜欢它,而不是更标准的foreach技术.为什么?

你开始用一个简单的<table>foreach.然后一些用户说你需要处理交替的行样式.首先添加ifs.然后另一个用户说您需要能够按给定列进行排序.你用另一个来处理这个ifs.第三个用户要求您处理分页=>另一个ifsforeach你的看法.你最后得意大利面.

结论:使用合适的枪用于正确的目标.对于简单的表,传统方法很好地工作,但是一旦你开始做更高级的东西使用帮助器.

  • 是的,但如果需要学习,那么Spark有智能感知; 虽然目前我在VS HTML编辑器中编辑它.Spark非常简单.我自己首先使用了MvcContrib网格和助手.但是当我开始使用Spark时,我最终最终用纯净的HTML/Spark标记替换了所有这些(以及其他"助手").问题是,"一旦你开始更高级的东西",那么帮助者(如网格)就会破裂.处理复杂的嵌套标签,条件属性等很困难.帮助者在HTML上添加抽象,最终会泄漏. (2认同)

Tom*_*mmy 1

乍一看很难看,但我认为它相当简洁并且考虑了很多逻辑。例如,标准 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>
Run Code Online (Sandbox Code Playgroud)

我很确定我也错过了其中的一些东西。传统上,我必须跟踪行计数或以某种方式知道它是否是交替行,有一种情况是我没有记录并且通常有很多<% %>标签来处理这些代码块。