3

我有一个大型ASP.NET-MVC项目,并且在共享 View 文件夹中有很多文件。

我想对这些文件(Views)进行分组以使其更易于理解。我看到这个博客帖子似乎有同样的问题,但我想避免在我的解决方案中添加额外的依赖项/ dll

无论如何都可以在没有任何外部依赖项的情况下组织共享 视图目录。我正在使用aspx视图引擎(不是Razor)

4

6 回答 6

4

在 ASP.NET MVC 中,共享以多种方式工作。

1) 使用控制器的视图文件夹。

是的,View Engine 将始终检查您的共享文件夹以获取部分视图。但在检查共享文件夹之前,View Engine 会检查“活动”文件夹。

因此,为了更详细地解释,假设您正在使用HomeController,在“ Home ”视图文件夹中渲染一个视图,并且您正在渲染一个名为“NavPartial”的局部视图。在为局部视图检查您的“共享”文件夹之前,视图引擎将首先检查您的“主页”视图文件夹。

这意味着如果您需要在 Controller 中重复使用 Partials,您可以将它们打包到该 Controller 的专用视图文件夹中。

我觉得这种方法很方便。我组织我的项目和控制器结构以利用。

2) 使用领域

如果您使用区域,每个区域都有一个专用的“共享”文件夹。如果您的功能是该区域的本地功能,这又很方便。

于 2013-10-30T19:31:30.773 回答
3

由于您提供的链接是指 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
        .....
    }

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

  • 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 - 子文件夹中的部分视图

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

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

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

于 2013-10-30T08:12:24.313 回答
3

这对于 asp.net mvc 来说是什么,都可以自定义。

你可以在你的结构看起来像这样的地方做这样的事情

文件夹结构

这是关于显示模板

显示使用

@Html.Display("","Home/Managable",null)

Display 是查找局部视图并渲染的辅助扩展方法。

如果你想要基于编辑器,那么你可以使用编辑器模板和扩展方法是 Editor , EditorFor 等。

这里的示例在 Razor 中,但同样适用于 aspx 视图引擎。

于 2013-11-02T11:30:05.990 回答
1

在 Views 文件夹中,创建任何您认为合乎逻辑的文件夹结构。

然后只需使用文件的完整相对路径调用每个视图(或部分视图)。即使它更多地键入调用视图,使用良好的文件夹结构也将节省时间,因为它会更容易和更清晰地查看您正在调用的(逻辑上)视图类型。

这也可以带来一些性能优势,因为视图渲染不需要在几个可能的位置寻找您的视图。

如果它不符合您的需求,我发现以“基于约定的方式”执行它是非常难得的好处。


我还可能会提到另一个好技巧;删除所有默认视图引擎并确保仅注册您正在使用的视图引擎。这也将提高性能。像这样:

protected void Application_Start() {
    ViewEngines.Engines.Clear();
    // ViewEngines.Engines.Add(new RazorViewEngine());
    ViewEngines.Engines.Add(new WebFormViewEngine());
}
于 2013-11-04T04:34:23.030 回答
0

只需遵循以下提示:

  1. 将每个创建PartialView到其相关的 Controller 文件夹中,以避免拥挤的 Shared Folder
  2. 对项目使用您自己的命名约定Shared,因此通过在其名称的开头使用相关字符来对每个主题进行聚类。当您抓取Shared文件夹时,只需按相关键即可找到其组!
  3. 如果您在项目中处理真正独立的概念,请使用 Areas. 这是一种简单的方法,也易于配置。每个都Area 允许您Shared在其上拥有单独的文件夹。

请不要试图改变微软平台的逻辑。他们比我们更了解这个麻烦。根据我的经验,以各种方式更改 MVC 应用程序的逻辑可能会导致出现模棱两可的错误或功能。可能会有一个更新来增强这部分。

于 2013-11-03T21:42:59.083 回答
0

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

团体

然后访问部分视图只需编写:

return PartialView("Group1/_Chart", model);
于 2013-11-04T13:33:09.840 回答