将子目录添加到ASP.Net MVC中的"View/Shared"文件夹并调用视图

lam*_*ant 48 asp.net asp.net-mvc razor asp.net-mvc-3 asp.net-mvc-2

我目前正在使用带有Razor的ASP.Net MVC3开发一个站点.在"查看/共享"文件夹中,我想添加一个名为"Partials"的子文件夹,我可以在其中放置所有部分视图(为了更好地组织网站).

只要在调用视图时总是引用"Partials"文件夹(使用Razor),我就可以毫无问题地执行此操作:

@Html.Partial("Partials/{ViewName}")
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果有一种方法可以将"Partials"文件夹添加到.Net在搜索视图时经历的列表中,这样我就可以调用我的视图而无需引用"Partials"文件夹,如下所示:

@Html.Partial("{ViewName}")
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

lam*_*ant 65

解决了这个问题.要将我创建的"共享/部分"子目录添加到尝试在Razor中查找部分视图时搜索的位置列表,请执行以下操作:

@Html.Partial("{NameOfView}")
Run Code Online (Sandbox Code Playgroud)

首先创建一个以RazorViewEngine为基类的视图引擎,并按如下方式添加视图位置.同样,我想将所有部分视图存储在我在MVC创建的默认"Views/Shared"目录中创建的"Partials"子目录中.

public class RDDBViewEngine : RazorViewEngine
{
    private static readonly string[] NewPartialViewFormats = 
    { 
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    };

    public RDDBViewEngine()
    {
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
    }       

}
Run Code Online (Sandbox Code Playgroud)

请注意,位置格式中的{1}是Controller名称,{0}是视图的名称.

然后将该视图引擎添加到global.asax的Application_Start()方法中的MVC ViewEngines.Engines Collection:

ViewEngines.Engines.Add(new RDDBViewEngine()); 
Run Code Online (Sandbox Code Playgroud)

  • 区域可用以及PartialViewLocationFormats中的{2}. (3认同)

小智 28

谢谢您的回答.这已经组织了我的共享文件夹,但为什么要创建一种新类型的视图引擎?我刚刚创建了一个新的RazorViewEngine,设置它PartialViewLocationFormats并将其添加到列表中ViewEngines.

ViewEngines.Engines.Add(new RazorViewEngine
{
    PartialViewLocationFormats = new string[]
    {
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 创建自己的类将允许您将来重用它,而不是记住每次都要手写这些字符串文字. (3认同)

rep*_*iau 16

定制视图引擎很不错,但是如果你只想要一个子文件夹,你就不需要那么多......

只需使用部分视图的完整路径,就像布局视图所做的那样:

@Html.Partial("/Views/Shared/Partial/myPartial.cshtml")
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人......

  • 对于MVC 5,只需输入@ Html.Partial("Partial/myPartial.cshtml") (6认同)

mcf*_*fea 6

我已经更新了lamarant的优秀答案,包括区域:

public class RDDBViewEngine : RazorViewEngine
{
    private static readonly string[] NewPartialViewFormats =
    {
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    };

    private static List<string> AreaRegistrations;

    public RDDBViewEngine()
    {
        AreaRegistrations = new List<string>();

        BuildAreaRegistrations();

        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(areaRegistrations).ToArray();
    }

    private static void BuildAreaRegistrations()
    {
        string[] areaNames = RouteTable.Routes.OfType<Route>()
            .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area"))
            .Select(r => r.DataTokens["area"].ToString()).ToArray();

        foreach (string areaName in areaNames)
        {
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/Shared/Partials/{0}.cshtml");
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/{1}/Partials/{0}.cshtml");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后不要忘记在您的应用程序中包括开始:

public class MvcApplication : System.Web.HttpApplication
{

    protected void Application_Start()
    {
        ...

        ViewEngines.Engines.Add(new RDDBViewEngine()); 
    }
}
Run Code Online (Sandbox Code Playgroud)


sal*_*uce 6

如果您在ASP.NET Core中执行此操作,则只需转到“ ConfigureServices方法” 下的“启动”类,然后将

services.AddMvc()
    .AddRazorOptions(opt => {
        opt.ViewLocationFormats.Add("/Views/{1}/Partials/{0}.cshtml");
        opt.ViewLocationFormats.Add("/Views/Shared/Partials/{0}.cshtml");
    });
Run Code Online (Sandbox Code Playgroud)


Sri*_*kat 5

您还可以更新已注册的RazorViewEngine的partialview-location-formats格式.将以下代码放在Global.asax的Application_Start中.

 RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault();
        if (razorEngine != null)
        {
            string[] newPartialViewFormats = new[] { 
                    "~/Views/{1}/Partials/{0}.cshtml",
                    "~/Views/Shared/Partials/{0}.cshtml"
            };
            razorEngine.PartialViewLocationFormats =
                razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray();
        }
Run Code Online (Sandbox Code Playgroud)