Asp.net 更改视图位置
我正在用MVC2.0开发一个网站。我想更改网站中的查看文件夹位置。我想把视图文件夹保存在其他文件夹中,当我尝试这样做时,我会遇到以下错误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
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”}…});