代码之家  ›  专栏  ›  技术社区  ›  sipsorcery

是html.renderAction代码气味[关闭]

  •  2
  • sipsorcery  · 技术社区  · 16 年前

    我最近开始了一项新的工作,我被投入到正在开发的ASP.NET MVC应用程序的错误修复角色中。我非常喜欢将MVC方法用于Web应用程序,并在上面构建了一些重要的生产应用程序 Maverick.Net 从2004/2005年开始,这是我第一次使用ASP.NET MVC框架来处理任何事情,而不是乱搞。

    我发现自己在修复bug方面做了很多工作,其中一件事就是在html.renderation调用之后通过控制器链进行追踪。在过去,当我编写MVC应用程序时,一个控制器将负责生成整个模型。如果每个控制器都有公共的部分或函数,那么它们将被分类,移动到数据访问层中。在我看来,在这种情况下,我怀疑其他人,HTML.renderation会鼓励一些严重的分裂代码,并真正破坏了拥有独特的C-M-V阶段的目的,因为它现在成为C-M-V-C-M-V-C-M-V等。

    html.renderation真的是鼓励使用干净代码的最佳方法吗?我觉得这有点难闻?

    4 回复  |  直到 11 年前
        1
  •  3
  •   John Farrell    16 年前

    “在html.renderAction调用后,错误修复正在通过控制器链进行跟踪。”

    哦,上帝。听起来很可怕。

    这肯定很臭。渲染只适用于那些“高级小部件”场景。

        2
  •  2
  •   sipsorcery    15 年前

    在对项目和ASP.NET MVC框架进行了一段时间的工作之后,我得出的结论是,不应在生产代码中使用renderAction(也许该规则有一个例外,但我还没有遇到),而是使用renderpartial并向模型提供对它的调用。

    这样一来,只有一个控制器阶段可以使维护更加容易,另外,单个控制器阶段可以确保任何昂贵的操作(如数据库交互)都尽可能高效,如果处理跨多个控制器阶段就无法完成。通过使用renderpartial mutliple块视图逻辑,可以遵循dry原理,保持了renderaction的主要优点,但没有两大缺点。

    坏的:

    Html.RenderAction("ViewName", "PersonName", new { id = Model.Person.ID });
    

    好:

    Html.RenderPartial("ViewName", Model.Person.Name);
    
        3
  •  1
  •   Erik Philips Gabriel Costa    11 年前

    这是一个古老的问题,但今天仍然适用于代码。应该使用的时间是呈现与当前信息无关的部分视图。例如,如果您有一个在每个页面上呈现但由模型填充的导航。把这个模型放在其他模型上,当它们不相关的时候,这是一个糟糕的mojo。

    +---------+ +-----+
    |         | |     |
    | content | | nav |
    |         | |     |
    +---------+ +-----+
    

    如果将角色集传递给renderAction()方法,然后使用甜甜圈孔缓存,则可以缓存导航。

        4
  •  -3
  •   Marko    16 年前

    我认为最好不要尽可能多地使用所有这些帮助器,集成的或习惯性地编写的。这就像是一个快速解决设计问题的便捷快捷方式,但你真正做的是把事情搞得一团糟。