我目前正在将现有的webforms应用程序转换为MVC,但不确定如何设计其中的一个页面。现有页面有2500行代码,负责显示同一信息的几种不同视图。下面的示例只是这个页面的一小部分(工具栏),但我不确定避免重复代码的最好方法是什么。
管理员视图工具栏:保存、PDF、打印、拼写检查、管理文档、员工视图切换
工具栏的经理视图:保存、PDF、打印、拼写检查、员工视图切换
工具栏的员工视图:保存、PDF、打印、拼写检查
我已经将应用程序拆分为三个不同的视图。它们使用相同的局部视图来呈现页面内容,但目前每个视图都有自己的工具栏副本。因此,保存、PDF、打印和拼写检查的HTML元素在每个视图中都是重复的。最好是有一个局部视图来呈现工具栏,但是为了做到这一点,我需要在视图中放入某种逻辑,以确定它是应该显示Employee view Toggle链接还是应该显示管理文档。
我在开发其他新页面时也遇到过类似的问题。最初,不同页面的需求具有相同的元素,我们将这些元素拆分为部分视图。在测试和添加更多功能之后,最终每个页面上的局部视图需要略有不同。通常只是某些控件的可见性,但最终部分视图中有一堆逻辑来检查几件事,以确定是否应该显示某些内容。
在大多数元素都相同的情况下,处理略有不同的视图的最佳方法是什么?
发布于 2012-07-18 23:27:23
如果只是显示或隐藏同一控件/部分视图的不同部分的权限问题,我会说只需编写一个,并在其中包含一些代码来检查权限,并有条件地呈现或不呈现各个部分。如下所示:
<%@ 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;
}这样,您就可以将代码放在视图之外,而在视图中只有一行代码。上面的代码只是从我当前的项目中摘取出来并用作示例,但您可以编写任何复杂的逻辑并将其放入模型或控制器中,以便您的视图保持干净,而不是将业务逻辑放入其中。
https://stackoverflow.com/questions/11544598
复制相似问题