c# - 类似但不完全相同的元素的 MVC 部分 View

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

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

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

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

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

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

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

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

最佳答案

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

<%@ 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 />

编辑:

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

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

这样,您就可以将代码放在 View 之外,而在 View 中只包含一行代码。上面的代码只是从我当前的项目中取出并用作示例,但是您可以编写任何复杂的逻辑并将其放在模型或 Controller 中,以便您的 View 保持干净并且您不会将业务逻辑放在那里。

关于c# - 类似但不完全相同的元素的 MVC 部分 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11544598/

相关文章:

c# - Dotnet webclient 超时,但浏览器可以处理 json web 服务的文件

c# - 如何在ElasticSearch NEST 7.x中为具有文档ID的文档列表编制索引

nhibernate - NHibernate最简单的使用方法官方 "ASP.Net MVC 3 Getting Started"-教程

iOS - 如何在带有半透明黑色状态栏的 Storyboard中回收前 20 像素

c# - 如何在 ASP .NET MVC 5 View 中重命名 confirm() 按钮?

c# - TinyMCE 包

sql-server - MiniProfiler - SqlParameter

asp.net-mvc-3 - EF4.3知道上下文是否已成功插入实体

postgresql - 将删除替换为触发函数 : how to return affected row count?

swift - 如何在collectionview中查看pdf文件?