【问题标题】:why is using if-else blocks inside views dreaded? - MVC为什么在可怕的视图中使用 if-else 块? -MVC
【发布时间】:2010-11-16 12:07:41
【问题描述】:

哪些区域会受到影响?

代码可读性?可维护性?表现?安全?任何其他?

我的观点一直在使用类似的东西

if(Model.Showthis) {<div id = "showthis">...</div>} }

并且做以下类似的事情是否有安全隐患? --

<%if (HttpContext.Current.User.Identity.IsAuthenticated && item.Poster.UserName == HttpContext.Current.User.Identity.Name)%>
<%{%>
...
<%}%>

是的,我也读过"if" considered harmful in ASP.NET MVC View (.aspx) files?,但它并没有具体说明哪些区域会受到它的影响。我的意思是我想确保没有安全和性能方面的影响,链接没有准确回答

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我认为从 ASP 到 ASP.NET Forms 的过渡一直存在这种污名。 MVC 是一个不同的野兽。使用 MVC3 和 Razor,它应该有助于打破污名并允许更易读、更容易编写视图。

    也就是说,域和业务逻辑永远不应该出现在您的模板中。但我认为没有问题,并且经常使用条件语句和循环在我的视图中呈现 UI。

    【讨论】:

      【解决方案2】:

      只要分支逻辑纯粹用于 UI 问题,我认为它没有问题。考虑到这一点,我会将您的第二个 if 更改为:

      <%if (item.Poster.UserName == Model.CurrentUserName)%>
      <%{%>
      ...
      <%}%>
      

      并设置您的模型,使 CurrentUserName 属性如下所示:

      public string CurrentUserName
      {
          get
          {
              return HttpContext.Current.User.Identity.IsAuthenticated
                  ? HttpContext.Current.User.Identity.Name
                  : String.Empty;
          }
      }
      

      如果您要在系统中大量检查作者与当前用户,甚至更好,将该属性卸载到可以从多个模型中重用的辅助类。基本上我想得到当前用户名不在视图中的实现细节。

      【讨论】:

      • 所以如果我只需要检查用户是否经过身份验证,我应该使用 String.IsEmptyOrNull(Model.UserNam) 检查?
      • 如果您只关心他们是否经过身份验证,您可以使用if (HttpContext.Current.User.Identity.IsAuthenticated)。我认为您还需要检查帖子项目是否由当前用户创作(即:显示编辑链接或其他内容)。
      【解决方案3】:

      视图模板中的 if else 语句没有任何问题。您要避免的是视图模板中的业务或模型逻辑。如果条件与用户界面直接相关,那么它属于视图中。

      是的,由于 HTML 和 C# 的混合,它可能有点难以阅读,但是只要您的视图逻辑在您的视图中,并且您的模型逻辑在您的模型中,您就可以正确地维护关注点分离.

      您的第二个样品;如果正确的用户首先登录,则仅将您的海报提供给视图可能更有意义;对我来说,这似乎更像是控制器而不是视图。

      很多人看到视图中的 if 语句会感到畏缩,因为这让他们想起了经典的 ASP。但是经典 ASP 的问题从来不在于代码和 HTML 在同一个地方。就是业务逻辑和表现逻辑在同一个地方。

      编辑另外,可能是 "if" considered harmful in ASP.NET MVC View (.aspx) files? 的副本。

      【讨论】:

      • 是的,我也读过那个链接,但它并没有具体说明哪些区域会受到它的影响。我的意思是我想确保没有安全和性能方面的影响,链接没有准确回答
      【解决方案4】:

      它们为什么不好?

      正如许多人已经提出的那样,这是因为它可能是一个警告信号,表明业务逻辑正在泄漏到您的视图中,这是一件坏事。或者在你看来你试图做的太多了。通常,在控制器中设置必要的数据并传递所需的所有内容(包括任何计算值)并让视图直接渲染它会更容易。您的视图模型越扁平越简单越好。

      我不认为将 if/else 用于有条件地呈现 UI 的真正目的有什么问题。例如,如果用户已登录,则在未登录时渲染此部分内容。

      我认为很多人会退缩并快速得出“这是不好的做法”,因为它很容易导致标签汤。这种现象已经被强调为 asp.net webforms 引擎的继承。虽然仍然需要注意,但剃刀引擎的问题可能较小,因为它更清洁并且需要更少的语法来实现相同的目标。将 C#/VB 代码自动切换到 html 并返回非常简单,只需一个 @ 即可重新输入代码块。我认为这不会像尖括号 那样创建标签汤。后者的噪音量是大多数人反对的(这是正确的)。

      最后,视情况而定,如果您发现您的视图中开始出现大量 if/else 逻辑,有时将其放入 HTML 帮助程序会更简洁。我找不到参考资料,但我记得 Rob Connery 曾经说过,如果您发现自己开始在自己的视图中编写 if 语句,那么它就是 html 助手的候选者。

      是否存在安全问题?

      我认为您的要求不会有任何明显的性能差异或安全问题。但考虑到这样的身份验证检查可能会在多个视图中使用,我会将其放入 Html 帮助程序中。

      【讨论】:

        【解决方案5】:

        If-else 块特别好。视图中的代码很糟糕,因为您将 HTML 标记与代码混合在一起。 ASP.NET MVC 不利于将静态页面设计与动态 UI 代码分开。 Web 表单更擅长分离静态和程序化 UI 元素。

        【讨论】:

          猜你喜欢
          • 2016-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-03
          • 2019-10-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多