MVC部分视图用于相似但不完全相同的元素

时间:2012-07-18 15:12:49

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

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

<%@ 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;
        }

这样,您可以在视图外部使用代码,并在视图中只使用一行代码。上面的代码刚刚从我当前的项目中取出并用作示例,但您可以编写任何复杂的逻辑并将其放在模型或控制器中,以便您的视图保持干净,并且您不会将业务逻辑放在那里。 / p>