我有一个大型ASP.NET-MVC项目,并且在共享 View 文件夹中有很多文件。
我想对这些文件(Views)进行分组以使其更易于理解。我看到这个博客帖子似乎有同样的问题,但我想避免在我的解决方案中添加额外的依赖项/ dll。
无论如何都可以在没有任何外部依赖项的情况下组织共享 视图目录。我正在使用aspx视图引擎(不是Razor)
我有一个大型ASP.NET-MVC项目,并且在共享 View 文件夹中有很多文件。
我想对这些文件(Views)进行分组以使其更易于理解。我看到这个博客帖子似乎有同样的问题,但我想避免在我的解决方案中添加额外的依赖项/ dll。
无论如何都可以在没有任何外部依赖项的情况下组织共享 视图目录。我正在使用aspx视图引擎(不是Razor)
在 ASP.NET MVC 中,共享以多种方式工作。
1) 使用控制器的视图文件夹。
是的,View Engine 将始终检查您的共享文件夹以获取部分视图。但在检查共享文件夹之前,View Engine 会检查“活动”文件夹。
因此,为了更详细地解释,假设您正在使用HomeController,在“ Home ”视图文件夹中渲染一个视图,并且您正在渲染一个名为“NavPartial”的局部视图。在为局部视图检查您的“共享”文件夹之前,视图引擎将首先检查您的“主页”视图文件夹。
这意味着如果您需要在 Controller 中重复使用 Partials,您可以将它们打包到该 Controller 的专用视图文件夹中。
我觉得这种方法很方便。我组织我的项目和控制器结构以利用。
2) 使用领域
如果您使用区域,每个区域都有一个专用的“共享”文件夹。如果您的功能是该区域的本地功能,这又很方便。
由于您提供的链接是指 MVC 3,我为此版本创建了一个示例。假设示例将包含名为“Group1”的子文件夹,您可以创建自定义视图引擎类并将自定义路径添加到 PartialViewLocationFormats 集合:
public class MyViewEngine : WebFormViewEngine
{
public MyViewEngine()
{
PartialViewLocationFormats = PartialViewLocationFormats.Union(new[]
{
"~/Views/Shared/Group1/{0}.ascx"
}).ToArray();
}
}
如果您在“视图/共享”文件夹中有多个子文件夹,您当然可以添加其他路径。
编辑 Global.asax 文件并将 MyViewEngine 添加到 Application_Start() 方法中的 ViewEngines.Engines 集合中:
protected void Application_Start()
{
ViewEngines.Engines.Add(new MyViewEngine());
//the remaining Application_Start implementation follows below
.....
}
在示例应用程序中,我添加了两个局部视图:
一个示例 Index.ascx 文件将如下所示:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Home Page
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2><%: ViewBag.Message %></h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<p>
<%: Html.Partial("SharedRoot") %>
</p>
<p>
<%: Html.Partial("SharedGroup1") %>
</p>
这是示例解决方案结构的图片:
我还上传了一个示例 VS 2012 MVC 3 应用程序:
http://www.biromt.com/samples/MvcSharedViewsInSubfolders.zip
更新:请注意,您不能在此解决方案的不同子文件夹中使用具有相同名称的文件。您将始终只获得第一个部分视图(根据搜索顺序),而其他部分将被忽略。所以,如果你只需要在子文件夹之间排列共享文件夹中的文件,这个概念就可以了。如果您之后添加文件或重命名其中一些文件,请记住此注释。有关更多详细信息,请参阅下面的讨论(感谢 Max)。
这对于 asp.net mvc 来说是什么,都可以自定义。
你可以在你的结构看起来像这样的地方做这样的事情
这是关于显示模板
显示使用
@Html.Display("","Home/Managable",null)
Display 是查找局部视图并渲染的辅助扩展方法。
如果你想要基于编辑器,那么你可以使用编辑器模板和扩展方法是 Editor , EditorFor 等。
这里的示例在 Razor 中,但同样适用于 aspx 视图引擎。
在 Views 文件夹中,创建任何您认为合乎逻辑的文件夹结构。
然后只需使用文件的完整相对路径调用每个视图(或部分视图)。即使它更多地键入调用视图,使用良好的文件夹结构也将节省时间,因为它会更容易和更清晰地查看您正在调用的(逻辑上)视图类型。
这也可以带来一些性能优势,因为视图渲染不需要在几个可能的位置寻找您的视图。
如果它不符合您的需求,我发现以“基于约定的方式”执行它是非常难得的好处。
我还可能会提到另一个好技巧;删除所有默认视图引擎并确保仅注册您正在使用的视图引擎。这也将提高性能。像这样:
protected void Application_Start() {
ViewEngines.Engines.Clear();
// ViewEngines.Engines.Add(new RazorViewEngine());
ViewEngines.Engines.Add(new WebFormViewEngine());
}
只需遵循以下提示:
PartialView
到其相关的 Controller 文件夹中,以避免拥挤的 Shared Folder。Shared
,因此通过在其名称的开头使用相关字符来对每个主题进行聚类。当您抓取Shared
文件夹时,只需按相关键即可找到其组!Areas
. 这是一种简单的方法,也易于配置。每个都Area
允许您Shared
在其上拥有单独的文件夹。请不要试图改变微软平台的逻辑。他们比我们更了解这个麻烦。根据我的经验,以各种方式更改 MVC 应用程序的逻辑可能会导致出现模棱两可的错误或功能。可能会有一个更新来增强这部分。
如果您正在更改常规层次结构,那么您只需告诉新的文件夹层次结构,就像我为共享视图创建了一个组一样:
然后访问部分视图只需编写:
return PartialView("Group1/_Chart", model);