我有一个很大的 ASP.NET-MVC 项目,我在共享 View文件夹中有很多文件< / em>的。
我想将这些文件(视图)分组,以便更容易理解。我看到this blog pos t似乎有同样的问题,但我想在我的解决方案中避免使用其他依赖项/ dll 。
无论如何组织共享 视图目录而没有任何外部依赖关系。我使用 aspx 查看引擎( 不 Razor)
答案 0 :(得分:4)
在ASP.NET MVC中,共享以多种方式工作。
1)使用Controller的查看文件夹。
是的,View Engine将始终检查您的共享文件夹以查看部分视图。但在检查共享文件夹之前,View Engine将检查“活动”文件夹。
因此,为了更详细地解释,请采用 HomeController 的方案,在“ Home 中呈现视图“查看文件夹,您正在呈现名为”NavPartial“的部分视图。在检查部分视图的“ 共享 ”文件夹之前,View Engine会检查您的“ 主页 ”视图文件夹优先。
这意味着如果您需要在Controller中重复使用Partials,您可以将它们打包到该Controller的专用视图文件夹中。
我发现这种方法很方便。我组织我的项目和Controller结构以便利用。
2)使用区域
如果您使用区域,则每个区域都有一个专用的“ 共享 ”文件夹。如果您的功能是该区域的本地功能,这将再次方便。
答案 1 :(得分:3)
由于您提供的链接是指MVC 3,因此我为此版本创建了一个示例。假设该示例将包含名为“Group1”的子文件夹,您可以创建自定义视图引擎类并向PartialViewLocationFormats集合添加自定义路径:
public class MyViewEngine : WebFormViewEngine
{
public MyViewEngine()
{
PartialViewLocationFormats = PartialViewLocationFormats.Union(new[]
{
"~/Views/Shared/Group1/{0}.ascx"
}).ToArray();
}
}
如果“Views / Shared”文件夹中有多个子文件夹,您当然可以添加其他路径。
编辑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
更新:请注意,您不能在此解决方案中使用不同子文件夹中具有相同名称的文件。您将始终只获得第一个局部视图(根据搜索顺序),而其他视图将被忽略。因此,如果您只需要在子文件夹中的Shared文件夹中排列文件,那么这个概念就可以了。如果您之后添加文件或重命名其中一些文件,请记住此注释。有关详细信息,请参阅下面的讨论(谢谢,Max)。
答案 2 :(得分:3)
对于asp.net mvc来说,所有都可以自定义。
你可以做你喜欢的结构
这是关于显示模板
显示使用
@Html.Display("","Home/Managable",null)
显示是辅助扩展方法,用于查找局部视图和渲染..
如果您想要基于编辑器,那么您可以使用编辑器模板和扩展方法是编辑器,编辑器等等。
这里的示例是在Razor中,但同样适用于aspx视图引擎..
答案 3 :(得分:1)
在Views文件夹中,创建您找到的任何逻辑上的文件夹结构。
然后使用文件的完整相对路径调用每个视图(或部分视图)。即使它更多的打字调用视图,具有良好的文件夹结构,它将节省时间,因为它将更容易和更清楚地看到你正在调用什么样的(逻辑)视图。
这也可以带来一些性能优势,因为视图呈现不需要在几个可能的位置查找您的视图。
如果它不符合您的需求,我发现以“基于会议的方式”这样做是非常罕见的。
我可能还会提到另一个好的提示;删除所有默认视图引擎,并确保只注册您正在使用的引擎。这也将提高性能。像这样:
protected void Application_Start() {
ViewEngines.Engines.Clear();
// ViewEngines.Engines.Add(new RazorViewEngine());
ViewEngines.Engines.Add(new WebFormViewEngine());
}
答案 4 :(得分:0)
请遵循以下提示:
PartialView
创建到其相关的Controller文件夹中以避免
拥挤的共享文件夹。Shared
项使用您自己的命名约定,以便群集
每个主题在其开头使用相关字符
名称。当您抓取Shared
文件夹时,只需按相关键即可
找到它的小组!Areas
。这是简单的方法,也很容易配置。每个Area
允许您在其上放置单独的Shared
文件夹。请不要尝试更改Microsoft Platform的逻辑。他们比我们更了解这个问题。根据我的经验,以各种方式更改MVC应用程序的逻辑可能会导致出现模糊的错误或功能。也许正在进行更新以加强这一部分。
答案 5 :(得分:0)
如果要更改常规层次结构,那么您只需告诉新文件夹层次结构,就像我为共享视图创建了一个组:
然后访问局部视图只写:
return PartialView("Group1/_Chart", model);