MVC 视图中的分支逻辑

Posted

技术标签:

【中文标题】MVC 视图中的分支逻辑【英文标题】:Branching logic in an MVC view 【发布时间】:2010-05-26 01:29:21 【问题描述】:

我发现自己在我的视图中编写了很多类似于下面的代码的代码。在这种情况下,我想为新手添加一些解释性 html,为专家用户添加不同的 HTML。

<% if (ViewData["novice"] != null )  %>
some extra  HTML for a novice
<%  else  %>
some HTML for an expert
<%  %>

这是表示逻辑,因此它在视图与控制器中是有意义的。但是,它会很快变得丑陋,尤其是当 ReSharper 想要移动所有的大括号以使其更加丑陋时(有没有办法为视图关闭它?)。

我的问题是这是否正确,或者我应该在控制器中分支到两个单独的视图?如果我做两个视图,我将有很多重复的 HTML 需要维护。

或者我应该做两个单独的视图,对共同的东西有一个共享的部分视图?

【问题讨论】:

【参考方案1】:

理想情况下,这种逻辑将在视图模型中处理,并且视图应该只是呈现模型。

所以你可能有类似的想法:

<%= ViewData["helptext"]  %>

您在控制器中的逻辑类似于:

ViewData["helpText"] = isNovice ? noviceText : expertText;

这样您就可以将该逻辑推回控制器并保持视图整洁

【讨论】:

我可以看到这样做的好处,但是如果文本是复杂的 HTML 标记,比如图像和其他东西怎么办?现在您的控制器中有 HTML。另外,感谢您修复我的代码示例 尼斯 lomax 好多了。我喜欢。 +1 这取决于复杂文本的情况以及需要多少更改,但我不明白为什么不能使用相同的方法来渲染可变部分? 如果它真的很复杂,你也可以把它分解成一个局部视图【参考方案2】:

您正在尝试使用相同的模型创建 2 个完全独立的 html 页面。你想要一个单独的视图。不要试图用条件分支逻辑来巧妙地设计模式。

HTML 助手在这里帮不了多少忙,因为除了 if else 之外,您似乎不会重复太多逻辑。

【讨论】:

我只能说即使没有重复的逻辑,我更愿意使用帮助程序而不是复制代码。重复代码只会导致维护头痛,应该不赞成 我认为您不需要单独的视图,因为它会产生额外的维护开销。我更倾向于将逻辑推回控制器并拥有一个干净的视图 您可以将重复代码放在部分中,但从整体上看,您似乎想要两个单独的视图,即“专家用户的不同 HTML”重复代码很糟糕,违反设计模式更糟糕 IMO .

以上是关于MVC 视图中的分支逻辑的主要内容,如果未能解决你的问题,请参考以下文章

MVC 3 - 控制器和视图模型 - 哪个应该包含大部分业务逻辑?

ASP.NET MVC – 模型简介

如何理解MVC中的Model?

控制器内部应该写啥逻辑?

MVC模式简介

JavaWeb_(MVC)管理员后台商品查询demo