【问题标题】:MVC partial views for elements that are similar, but are not exactly the same相似但不完全相同的元素的 MVC 部分视图
【发布时间】:2012-07-17 16:17:38
【问题描述】:

我目前正在将现有的 webforms 应用程序转换为 MVC,但不知道如何设计其中一个页面。现有页面有 2500 行代码,负责显示相同信息的多个不同视图。以下示例只是此页面的一小部分(工具栏),但我不确定避免重复代码的最佳方法是什么。

管理员视图工具栏: 保存、PDF、打印、拼写检查、管理文档、员工查看切换

工具栏的管理器视图: 保存、PDF、打印、拼写检查、员工视图切换

工具栏的员工视图: 保存、PDF、打印、拼写检查

我已将应用程序拆分为三个不同的视图。他们使用相同的局部视图来呈现页面的内容,但目前每个视图都有自己的工具栏副本。因此,用于保存、PDF、打印和拼写检查的 HTML 元素在每个视图中都是重复的。最好有一个局部视图来呈现工具栏,但为了做到这一点,我需要在视图中放置某种逻辑来确定它是否应该显示员工视图切换链接或管理文档。

我在开发其他新页面时也遇到了类似的问题。最初,不同页面的需求具有相同的元素,我们将其拆分为部分视图。在测试和添加更多功能之后,最终局部视图需要在每个页面上略有不同。通常它只是某些控件的可见性,但最终部分视图最终会在其中包含一堆逻辑来检查几件事以确定是否应该显示某些内容。

在大多数元素相同的情况下,处理略有不同的视图的最佳方法是什么?

【问题讨论】:

    标签: c# asp.net-mvc-3 views partial-views renderpartial


    【解决方案1】:

    如果只是显示或隐藏同一控件/部分视图/其他部分的不同部分的权限问题,我会说只需编写一个并在其中包含一些代码来检查权限并有条件地渲染或不渲染各个部分.像这样的:

    <%@ Control Language="C#" %>
    
    This is the toolbar!!
    
    <div class="fake-css-class">
    <%:Html.ActionLink("Save", "Save") %>
    <%:Html.ActionLink("PDF", "Pdf") %>
    <%:Html.ActionLink("Spell Check", "SpellCheck") %>
    <% if (CurrentUser.IsInRole("Admin") { %>
    <%: Html.ActionLink("Administrative Documents", "AdminDocs") %>
    <%} %>
    <% if (CurrentUser.IsInRole("Admin") || CurrentUser.IsInRole("Manager"){
            %>
    <%: Html.ActionLink("Employee View Toggle", "EmpView") %>
    <%} %>
    </div>
    
    <br />
    <br />
    

    编辑:

    当逻辑变得更复杂时,将函数添加到您的安全代码中,以便您可以将所有逻辑分离到您的模型/控制器中,并在视图中进行单个函数调用。例如这样的:

    public bool Authorize(string controllerName, string actionName) {
    
                bool authorize = false;
    
                foreach(var permission in this.permissions) {
                    if (permission.Matches(controllerName, actionName)) {
                        authorize = permission.Affirmative;
                    }
                }
    
                return authorize;
            }
    

    通过这种方式,您可以将代码放在视图之外,而只需在视图中添加一行代码。上面的代码只是从我当前的项目中取出并用作示例,但是您可以编写任何复杂的逻辑并将其放在模型或控制器中,这样您的视图就会保持干净并且您不会将业务逻辑放在那里。

    【讨论】:

    • 谢谢乔瓦尼。这是我们一直采取的方法,我只是觉得你的观点不应该有逻辑。根据我的阅读,进行简单的角色检查是可以接受的,但它似乎总是会变得更复杂。例如,如果要求更改为仅对具有编辑权限的用户提供保存按钮,则在查看特定类型的内容时,仅当有内容要保存并且在内容被“批准”之前,逻辑可以编辑起来非常复杂。
    • @nunes7452 我试图在评论中回复,但它变得混乱,更新了我上面的答案。
    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2019-06-04
    • 2019-03-24
    相关资源
    最近更新 更多