【问题标题】:Are IF..ELSE statements in a View frowned upon in ASP.NET MVC?在 ASP.NET MVC 中是否不赞成视图中的 IF..ELSE 语句?
【发布时间】:2011-04-22 11:28:06
【问题描述】:

我知道您希望将逻辑排除在您的观点之外。我可以通过使用 DisplayFor/EditorFor 并将 IEnumerables 传递给视图来消除大多数循环。

IF 语句呢?在视图中应该完全避免它们吗?谨慎使用?作为最后的手段?

假设您想显示隐藏基于用户角色的元素...如果没有 IF 语句您将如何执行此操作...也许是一个完全独立的视图?

只是想了解最佳实践。

谢谢!

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc


    【解决方案1】:

    保持一致,并牢记视图的目的 - 生成 HTML。为此,您当然需要一些if 构造在这里或那里。我认为有些人建议您在这里坚持一些天上掉馅饼、极度挑剔的纯粹主义,以牺牲可用、功能良好、定义明确的代码为代价。

    【讨论】:

    • 实际上,我会问相反的问题。为什么我不会在我的视图中添加一个 if 语句?有时显示的内容取决于模型的状态。
    • @Serge - 哈哈......谢谢:) @mcl - 我同意。这是一个罕见的视图,除了部分视图或非常简单的视图之外,它没有一些需要根据模型的某些条件决定生成什么 HTML。下面一些人的建议实际上打破了关注点分离的概念 :: 它专门要求模型或控制器处理如何显示事物。
    【解决方案2】:

    在您的视图中使用ifs 没有任何问题,只要您最终不将后端逻辑放入其中。

    【讨论】:

      【解决方案3】:

      Rob Conery 的经验法则是 "if there's and IF, make a helper"。就个人而言,我会说“谨慎使用”。我尽可能避免它,因为它使单元测试变得更加困难。

      对于要根据用户角色隐藏元素的情况:对于简单的场景,我可能会直接将检查放在视图中。不过,通常我仍然尝试使这些更简洁和可测试。所以而不是:

      @if (HttpContext.Current.User.IsInRole("admin")
      {
          // Show admin stuff
      }
      

      我会这样做:

      @if (Model.UserIsAdmin)
      {
          // Show admin stuff
      }
      

      另一方面,如果这些检查开始在您的视图中出现斑点,我可能会先有条件地在视图模型中创建元素,然后只显示已构建的内容。希望对您有所帮助。

      【讨论】:

        【解决方案4】:

        基本上每个视图都应该显示在 ViewModel 中传递的内容。如果 ViewModel 还不够,那么我会寻找一种方法来改进 ViewModel 创建本身,而不是 View 的逻辑。

        可以在创建 ViewModel 时评估所有条件。

        当然,这完全取决于您的项目组织可以容忍多少 View 中的自定义逻辑。

        【讨论】:

          【解决方案5】:

          我认为如果在视图中最好避免,您应该在视图中避免业务(模型)或应用程序(控制器)逻辑 在您的示例中,您可以创建不同的部分视图来显示,有些人认为取决于用户角色,并在控制器中放置您需要显示的视图的逻辑

          【讨论】:

            【解决方案6】:

            在我看来,If / else 可以谨慎使用,但对于您提到的示例,隐藏基于角色的元素 - if 检查绝对不应该出现在视图中。在需要的地方编写扩展程序和帮助程序。

            【讨论】:

              【解决方案7】:

              我建议在视图中通过“if”隐藏元素,但在代码中你必须禁用由隐藏元素激活的函数(方法)。

              【讨论】:

              • 顺便说一句,我想说,如果必须简单化: if (model.IsButtonOkVisible) //显示按钮。
              猜你喜欢
              • 1970-01-01
              • 2013-07-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多