CSHTML 文件无法在视图之外加载

Tra*_*ter 1 c# razor asp.net-mvc-4

我有一个 C# MVC Razor 网站。通常,控制器从 Views 文件夹加载视图。但是,我有一个特殊情况,我需要在 Views 文件夹之外渲染视图。我怎么做?

  • 控制器将加载 /Views/Random/Index.cshtml

  • 无法加载/Random/Index.cshtml

  • /Random/test.aspx 加载没有问题,但无法将 cshtml 文件更改为 aspx 文件,它们需要定期构建。

我尝试过在控制器中 return Redirect("/Random/Index.cshtml") ,但目前根本没有控制器。

奇怪的是它适用于我的生产环境,但不适用于本地主机。在本地主机中我得到:

不会提供您请求的页面类型,因为它已被明确禁止。扩展名“.cshtml”可能不正确。请检查下面的 URL 并确保拼写正确。

请求的 URL:/Random/Index.cshtml

Muk*_*und 5

你绝对可以做到这一点。为此,您需要创建一个新的自定义视图引擎,例如

public class MyViewEngine : RazorViewEngine
{
    private static string[] AdditionalViewLocations = new[]{
        "~/Random/{0}.cshtml"
    };

    public MyViewEngine()            
    {
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(AdditionalViewLocations).ToArray();
        base.ViewLocationFormats = base.ViewLocationFormats.Union(AdditionalViewLocations).ToArray();
        base.MasterLocationFormats = base.MasterLocationFormats.Union(AdditionalViewLocations).ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的global.asax的Application_Start方法中注册这个视图引擎,如下所示-

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

如果您希望视图引擎优先,请将其插入到第 0 个位置。像这样 -

ViewEngines.Engines.Insert(0, new MyViewEngine());
Run Code Online (Sandbox Code Playgroud)