В качестве альтернативы вы можете переопределить расположение механизмов просмотра для конкретного контроллера, не затрагивая механизмы просмотра для других контроллеров.
Это некоторые фрагменты из продукта, который я разрабатываю, но он показывает конструктор для одного из моих контроллеров и механизм представления, который я специально создал для контроллеров, которые наследуются от KBRenderMvcController.
Так что любой контроллер, основанный на KBRenderMvcController, также будет иметь мой механизм просмотра.
Однако я ни разу не очистил коллекцию движков представлений, которая имеет отношение к делу. Потому что я хотел, чтобы представления, используемые моим продуктом, использовались по умолчанию.
Короче говоря, если вы удалите \ App_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
}