Asp.net 更改视图位置

Asp.net 更改视图位置,asp.net,asp.net-mvc,asp.net-mvc-2,Asp.net,Asp.net Mvc,Asp.net Mvc 2,我正在用MVC2.0开发一个网站。我想更改网站中的查看文件夹位置。我想把视图文件夹保存在其他文件夹中,当我尝试这样做时,我会遇到以下错误 The view 'Index' or its master was not found. The following locations were searched: ~/Views/Search/Index.aspx ~/Views/Search/Index.ascx ~/Views/Shared/Index.aspx ~/Views/Shared/Ind

我正在用MVC2.0开发一个网站。我想更改网站中的查看文件夹位置。我想把视图文件夹保存在其他文件夹中,当我尝试这样做时,我会遇到以下错误

The view 'Index' or its master was not found. The following locations were searched:
~/Views/Search/Index.aspx
~/Views/Search/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
“我的视图”文件夹将位于~/XYZ/ABC/Views而不是~/Views中。请解决我的问题。如果我更改默认视图文件夹位置,是否会遇到任何问题。我是否需要更改HTML Helper类中的任何内容,因为我不知道MVC中的任何内容,因为这是我的开始项目,我不想冒险。请帮助我…

查看此位置


更简单的是这个

您需要创建一个自定义视图引擎并使用它。幸运的是,您可以从默认的构造函数继承并更改构造函数上的位置。以下是创建自己的视图引擎的指南:

从文章中:

protected void Application_Start()
{
    //... other things up here.

    // I want to REMOVE the ASP.NET ViewEngine...
    ViewEngines.Engines.Clear();

    // and then add my own :)
    ViewEngines.Engines.Add(new HoTMeaTViewEngine());
}

public class HoTMeaTViewEngine : VirtualPathProviderViewEngine
{
    public HoTMeaTViewEngine()
    {
        // This is where we tell MVC where to look for our files. This says
        // to look for a file at "Views/Controller/Action.html"
        base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.html" };

        base.PartialViewLocationFormats = base.ViewLocationFormats;
    }
}

或者,可以替代特定控制器的视图引擎位置,而不影响其他控制器的视图引擎

    #region Constructor
    public KBRenderMvcController()
        : base()
    {
        viewEngine = new KBFrontEndViewEngine();
        if (!this.ViewEngineCollection.Contains(viewEngine))
            this.ViewEngineCollection.Insert(0, viewEngine);
    }
    #endregion

public class KBFrontEndViewEngine : RazorViewEngine
{
    #region Fields
    private static bool _Initialized = false;
    private static string[] viewLocationFormats = null;
    private static string[] partialViewLocationFormats = null;
    private static string[] viewEngineFileExtensions = new string[] { "cshtml" };
    #endregion

    #region Constructor
    public KBFrontEndViewEngine()
    {            
        if (!_Initialized)
        {
            viewLocationFormats = new string[] 
                    { 
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/{1}/{0}.cshtml"), 
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/Partials/{0}.cshtml") 
                    };
            partialViewLocationFormats = new string[] 
                    { 
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/{1}/Partials/_partial{0}.cshtml"), 
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/Partials/_partial{0}.cshtml"),
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/{1}/Dialogs/_dialog{1}.cshtml"),
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/Dialogs/_dialog{1}.cshtml"),
                    };
            _Initialized = true;
        }
        base.ViewLocationFormats = viewLocationFormats;
        base.PartialViewLocationFormats = partialViewLocationFormats;
        base.MasterLocationFormats = viewLocationFormats;
        base.FileExtensions = viewEngineFileExtensions;
    }
    #endregion

    #region Methods
    //Don't run on requests that are not for our hijacked controllers
    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
    {
        Type controllerType = controllerContext.Controller.GetType();
        Type baseType = controllerType.BaseType;
        if ((baseType != null) && (baseType.Name == "KBRenderMvcController`1") || (baseType.Name == "KBFrontEndBaseSurfaceController"))
            return base.FindPartialView(controllerContext, partialViewName, useCache);
        else
            return new ViewEngineResult(new List<string>());
    }
    #endregion
}
这些是我正在开发的产品中的一些片段,但它显示了我的一个控制器的构造函数,以及我为从KBRenderMvcController继承的控制器专门制作的视图引擎

因此,任何基于KBRenderMvcController的控制器也将具有我的视图引擎

然而,在任何时候我都没有清除视图引擎集合,这是相关的。因为我想让我的产品使用的视图返回到默认位置

简而言之,如果删除\App\u plugins\Product\Views\MyView并创建\Views\MyView,它仍将从\Views\MyView进行渲染

此外,在ViewEngine中,我演示了确定正在使用的控制器类型的代码,如果它不是目标控制器,我将返回空的视图位置,以便它们不会用于其他控制器

    #region Constructor
    public KBRenderMvcController()
        : base()
    {
        viewEngine = new KBFrontEndViewEngine();
        if (!this.ViewEngineCollection.Contains(viewEngine))
            this.ViewEngineCollection.Insert(0, viewEngine);
    }
    #endregion

public class KBFrontEndViewEngine : RazorViewEngine
{
    #region Fields
    private static bool _Initialized = false;
    private static string[] viewLocationFormats = null;
    private static string[] partialViewLocationFormats = null;
    private static string[] viewEngineFileExtensions = new string[] { "cshtml" };
    #endregion

    #region Constructor
    public KBFrontEndViewEngine()
    {            
        if (!_Initialized)
        {
            viewLocationFormats = new string[] 
                    { 
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/{1}/{0}.cshtml"), 
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/Partials/{0}.cshtml") 
                    };
            partialViewLocationFormats = new string[] 
                    { 
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/{1}/Partials/_partial{0}.cshtml"), 
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/Partials/_partial{0}.cshtml"),
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/{1}/Dialogs/_dialog{1}.cshtml"),
                        string.Concat(KBApplicationCore.PluginRelUrl, "/Views/Dialogs/_dialog{1}.cshtml"),
                    };
            _Initialized = true;
        }
        base.ViewLocationFormats = viewLocationFormats;
        base.PartialViewLocationFormats = partialViewLocationFormats;
        base.MasterLocationFormats = viewLocationFormats;
        base.FileExtensions = viewEngineFileExtensions;
    }
    #endregion

    #region Methods
    //Don't run on requests that are not for our hijacked controllers
    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
    {
        Type controllerType = controllerContext.Controller.GetType();
        Type baseType = controllerType.BaseType;
        if ((baseType != null) && (baseType.Name == "KBRenderMvcController`1") || (baseType.Name == "KBFrontEndBaseSurfaceController"))
            return base.FindPartialView(controllerContext, partialViewName, useCache);
        else
            return new ViewEngineResult(new List<string>());
    }
    #endregion
}
#区域构造函数
公共KBRenderMvcController()
:base()
{
viewEngine=新的KBFrontEndViewEngine();
如果(!this.ViewEngineCollection.Contains(viewEngine))
this.ViewEngineCollection.Insert(0,viewEngine);
}
#端区
公共类KBFrontEndViewEngine:RazorViewEngine
{
#区域字段
私有静态bool_Initialized=false;
私有静态字符串[]viewLocationFormats=null;
私有静态字符串[]partialViewLocationFormats=null;
私有静态字符串[]viewEngineFileExtensions=新字符串[]{“cshtml”};
#端区
#区域构造函数
公共KBFrontEndViewEngine()
{            
如果(!\u已初始化)
{
viewLocationFormats=新字符串[]
{ 
string.Concat(KBApplicationCore.PluginRelUrl,“/Views/{1}/{0}.cshtml”),
string.Concat(KBApplicationCore.PluginRelUrl,“/Views/Partials/{0}.cshtml”)
};
partialViewLocationFormats=新字符串[]
{ 
string.Concat(KBApplicationCore.PluginRelUrl,“/Views/{1}/Partials/_partial{0}.cshtml”),
string.Concat(KBApplicationCore.PluginRelUrl,“/Views/Partials/_partial{0}.cshtml”),
string.Concat(KBApplicationCore.PluginRelUrl,“/Views/{1}/Dialogs/_dialog{1}.cshtml”),
string.Concat(KBApplicationCore.PluginRelUrl,“/Views/Dialogs/_dialog{1}.cshtml”),
};
_初始化=真;
}
base.ViewLocationFormats=ViewLocationFormats;
base.PartialViewLocationFormats=PartialViewLocationFormats;
base.MasterLocationFormats=viewLocationFormats;
base.FileExtensions=viewEngineFileExtensions;
}
#端区
#区域方法
//不要在不是针对被劫持控制器的请求上运行
公共覆盖视图引擎结果FindPartialView(ControllerContext ControllerContext、字符串partialViewName、布尔useCache)
{
类型controllerType=controllerContext.Controller.GetType();
类型baseType=controllerType.baseType;
if((baseType!=null)&&(baseType.Name==“KBRenderMvcController`1”)| |(baseType.Name==“KBFrontEndBaseSurfaceController”))
返回base.FindPartialView(controllerContext、partialViewName、useCache);
其他的
返回新的ViewEngineResult(new List());
}
#端区
}

如果您不想全力以赴创建自己的ViewEngine,只需在App_Start:ViewEngines.Engines.Clear()中的现有引擎上设置位置格式即可;添加(新WebFormViewEngine{LocationFormats=新字符串[]{“~/Views/{1}/{0}.html”}…});