【问题标题】:Branching logic in an MVC viewMVC 视图中的分支逻辑
【发布时间】: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 需要维护。

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

【问题讨论】:

    标签: asp.net-mvc views


    【解决方案1】:

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

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

    <%= ViewData["helptext"]  %>
    

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

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

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

    【讨论】:

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

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

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

    【讨论】:

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