哪些方面会受到影响?
代码可读性?可维护性?性能?安全?任何其他?
我的观点一直在使用类似
的内容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?,但没有明确指出受它影响的区域。我的意思是我想确保没有安全性和性能影响,链接没有完全回答
答案 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元素。