Изменить расположение просмотров - PullRequest
3 голосов
/ 29 апреля 2010

Я занимаюсь разработкой сайта в MVC 2.0. Я хочу изменить местоположение папки View на моем веб-сайте. Я хотел сохранить папку представлений внутри других папок. Когда я пытаюсь это сделать, я получаю следующие ошибки

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. Пожалуйста, решите мою проблему. Буду ли я получать какие-либо проблемы, если я изменю расположение папки Views по умолчанию. Нужно ли что-то менять в классах HTML Helper, потому что я ничего не знаю в MVC, так как это мой начальный проект, которым я не хочу рисковать ...

Ответы [ 3 ]

5 голосов
/ 29 апреля 2010

Вам нужно будет создать собственный движок представления и использовать его вместо этого. К счастью, вы можете просто наследовать от значения по умолчанию и изменить расположение конструктора. Вот руководство по созданию собственного движка просмотра: http://www.singingeels.com/Articles/Creating_a_Custom_View_Engine_in_ASPNET_MVC.aspx

Из статьи:

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;
    }
}
3 голосов
/ 29 апреля 2010

Проверьте это место. Как изменить схему расположения вида по умолчанию в ASP.NET MVC?

                           base.ViewLocationFormats = new string[] { 
                "~/Views/{1}/{2}/{0}.aspx", 
                "~/Views/{1}/{2}/{0}.ascx", 
                "~/Views/Shared/{2}/{0}.aspx", 
                "~/Views/Shared/{2}/{0}.ascx" ,
                 "~/Views/{1}/{0}.aspx", 
                "~/Views/{1}/{0}.ascx", 
                "~/Views/Shared/{0}.aspx", 
                "~/Views/Shared/{0}.ascx" 

Еще проще Можно ли указать пользовательское местоположение для «поиска представлений» в ASP.NET MVC?

0 голосов
/ 25 августа 2015

В качестве альтернативы вы можете переопределить расположение механизмов просмотра для конкретного контроллера, не затрагивая механизмы просмотра для других контроллеров.

Это некоторые фрагменты из продукта, который я разрабатываю, но он показывает конструктор для одного из моих контроллеров и механизм представления, который я специально создал для контроллеров, которые наследуются от 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...