为什么在视图中使用if-else块可怕? - MVC

时间:2010-11-11 21:50:41

标签: asp.net-mvc

哪些方面会受到影响?

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

我的观点一直在使用类似

的内容
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?,但没有明确指出受它影响的区域。我的意思是我想确保没有安全性和性能影响,链接没有完全回答

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

用你的第二个样本;如果正确的用户首先登录,那么仅将视图提供给View可能更有意义;对于我来说,这似乎更像是一个控制器而不是一个View。

很多人看到View中的语句和畏缩,因为它提醒他们经典的ASP。但是经典ASP的问题从来没有在同一个地方有代码和HTML;就是在同一个地方有业务逻辑和表示逻辑。

编辑此外,也许是"if" considered harmful in ASP.NET MVC View (.aspx) files?的重复。

答案 2 :(得分:1)

只要分支逻辑纯粹用于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;
    }
}

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

答案 3 :(得分:0)

他们为什么不好?

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

我认为将if / else用于有条件地呈现UI的真正目的并不是什么问题。例如,如果用户登录渲染此部分,如果它们不是渲染其他内容。

我认为很多人会被收回并画出一个艰难而快速的'这是不好的做法',因为它很容易导致标签汤。这种现象已经被突出显示为asp.net webforms引擎的延续。虽然仍然是一个值得注意的好事,但剃刀引擎可能不是一个问题,因为它更干净,并且需要更少的语法来实现相同的功能。 C#/ VB代码自动切换到html和返回非常简单,只需要@重新输入代码块。我认为这不会像斜角括号那样创建标签汤&lt; %%&gt;。后者的噪音量是大多数人反对的(也是正确的)。

最后,情况依赖,如果您发现在视图中开始获得大量if / else逻辑,有时将其放入HTML帮助程序会更清晰。我找不到参考文献,但我记得Rob Connery曾经说过,如果你发现自己开始在你的视图中编写if语句,而不是它是html助手的候选者。

是否存在安全问题?

我认为您所要求的内容不会出现明显的性能差异或安全问题。但是考虑到这样的身份验证检查可能会在多个视图中使用,我会把它放到一个Html帮助器中。

答案 4 :(得分:0)

if-else块特别不错。视图中的代码很糟糕,因为您将HTML标记与代码混合在一起。 ASP.NET MVC不适合将静态页面设计与动态UI代码分离。 Web窗体更好地分离静态和程序化UI元素。