在asp.net-mvc中,处理拥挤的Shared View文件夹的最佳方法是什么?

时间:2013-10-27 12:20:14

标签: asp.net asp.net-mvc partial-views

我有一个很大的 ASP.NET-MVC 项目,我在共享 View文件夹中有很多文件< / em>的。

我想将这些文件(视图)分组,以便更容易理解。我看到this blog pos t似乎有同样的问题,但我想在我的解决方案中避免使用其他依赖项/ dll

无论如何组织共享 视图目录而没有任何外部依赖关系。我使用 aspx 查看引擎( Razor)

6 个答案:

答案 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
        .....
    }

在示例应用程序中,我添加了两个部分视图:

  • SharedRoot.ascx位于“观看/共享”文件夹
  • SharedGroup1.ascx位于“Shared / Group1”文件夹

示例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>

以下是样本解决方案结构的图片:

MVC - partial views in subfolders

我还上传了一个样本VS 2012 MVC 3应用程序:

http://www.biromt.com/samples/MvcSharedViewsInSubfolders.zip

更新:请注意,您不能在此解决方案中使用不同子文件夹中具有相同名称的文件。您将始终只获得第一个局部视图(根据搜索顺序),而其他视图将被忽略。因此,如果您只需要在子文件夹中的Shared文件夹中排列文件,那么这个概念就可以了。如果您之后添加文件或重命名其中一些文件,请记住此注释。有关详细信息,请参阅下面的讨论(谢谢,Max)。

答案 2 :(得分:3)

对于asp.net mvc来说,所有都可以自定义。

你可以做你喜欢的结构

Folder Structure

这是关于显示模板

显示使用

@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)

请遵循以下提示:

  1. 将每个PartialView创建到其相关的Controller文件夹中以避免 拥挤的共享文件夹
  2. Shared项使用您自己的命名约定,以便群集 每个主题在其开头使用相关字符 名称。当您抓取Shared文件夹时,只需按相关键即可 找到它的小组!
  3. 如果您在项目中处理真正独立的概念,请使用 Areas。这是简单的方法,也很容易配置。每个Area 允许您在其上放置单独的Shared文件夹。
  4. 请不要尝试更改Microsoft Platform的逻辑。他们比我们更了解这个问题。根据我的经验,以各种方式更改MVC应用程序的逻辑可能会导致出现模糊的错误或功能。也许正在进行更新以加强这一部分。

答案 5 :(得分:0)

如果要更改常规层次结构,那么您只需告诉新文件夹层次结构,就像我为共享视图创建了一个组:

  

group

然后访问局部视图只写:

return PartialView("Group1/_Chart", model);