ASP.NET使用指定的Views文件夹

在 ASP.NET 中,如果想要指定自定义的 Views 文件夹用于视图查找,可以通过修改 视图引擎的设置 来实现。以下是实现方式:

1. 修改 ViewLocationFormats

通过自定义 RazorViewEngine 来指定视图的查找路径。

示例代码

在 Startup.cs 或者 Program.cs 中注册自定义视图引擎:

public class CustomViewEngine : RazorViewEngine
{
    public CustomViewEngine()
    {
        // 自定义视图搜索路径
        ViewLocationFormats = new[]
        {
            "~/CustomViews/{1}/{0}.cshtml",  // 例如 ~/CustomViews/ControllerName/ViewName.cshtml
            "~/CustomViews/Shared/{0}.cshtml" // 例如 ~/CustomViews/Shared/ViewName.cshtml
        };

        AreaViewLocationFormats = new[]
        {
            "~/Areas/{2}/CustomViews/{1}/{0}.cshtml",
            "~/Areas/{2}/CustomViews/Shared/{0}.cshtml"
        };
    }
}

将自定义视图引擎添加到服务容器:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    // 注入自定义视图引擎
    services.Configure<MvcViewOptions>(options =>
    {
        options.ViewEngines.Clear();
        options.ViewEngines.Add(new CustomViewEngine());
    });
}

2. 局部控制器覆盖视图位置

在某些情况下,只需要对某个特定控制器的 Views 文件夹进行修改。可以在返回视图时指定路径:

示例代码

public IActionResult Index()
{
    // 使用自定义路径加载视图
    return View("~/CustomViews/Home/Index.cshtml");
}

3. 全局统一指定文件夹路径

如果不想修改代码逻辑,可以在 Startup.cs 中统一配置 MVC 的视图引擎。

示例代码

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews().AddRazorOptions(options =>
    {
        // 自定义视图搜索路径
        options.ViewLocationFormats.Clear();
        options.ViewLocationFormats.Add("/CustomViews/{1}/{0}.cshtml");
        options.ViewLocationFormats.Add("/CustomViews/Shared/{0}.cshtml");
    });
}

4. 支持区域的自定义路径

如果使用了 MVC 的区域功能,需要确保区域的视图路径也被覆盖。

示例代码

public class CustomRazorViewEngine : RazorViewEngine
{
    public CustomRazorViewEngine()
    {
        AreaViewLocationFormats = new[]
        {
            "~/Areas/{2}/CustomViews/{1}/{0}.cshtml",
            "~/Areas/{2}/CustomViews/Shared/{0}.cshtml"
        };

        ViewLocationFormats = new[]
        {
            "~/CustomViews/{1}/{0}.cshtml",
            "~/CustomViews/Shared/{0}.cshtml"
        };
    }
}

5. 动态决定视图路径

如果需要在运行时根据条件动态指定视图文件夹,可以直接在 View 方法中指定路径:

public IActionResult CustomView()
{
    string customPath = "~/DynamicViews/" + ControllerContext.ActionDescriptor.ControllerName + "/" + "CustomView.cshtml";
    return View(customPath);
}

通过以上方式,可以灵活地在 ASP.NET 项目中使用指定的 Views 文件夹,提高代码结构的灵活性和可维护性。

评论