Pergunta

Atualização Importante
Desde o lançamento do MVC 2.0 Preview 1 este recurso foi implementado como parte do quadro real se sob a forma de Áreas. Mais detalhes disponíveis no blog do Phil Haack aqui

Eu tenho um controlador chamado ListManagerController. Este controlador contém um método ActionResult chamado Index (). Quando eu cick direito sobre Índice no Visual Studio e selecione Adicionar Ver o novo modo de exibição é criado em / views / ListManager / index.

No entanto eu quero a exibição do índice e todos os pontos de vista posteriores a ser criado em / views / Gerenciar / ListManager /. Como eu iria fazer isso?

Editar : Foi salientado que esta questão é uma duplicata da pergunta postada aqui . Parece minhas habilidades de busca me falhou inicialmente.

Foi útil?

Solução

A localização de pontos de vista está ligada à ViewFactory você está usando. AFAIK a web formas visualizar motores não suporta áreas [Gerenciar no seu exemplo].

faísca suporta isso e é muito limpo, você também pode misturar e formas jogo web e vistas de ignição assim que você don 't tem que recriar todos os seus pontos de vista.

UPDATE: Looks como Phil Haack tem um blogue post sobre como conseguir isso. Seu código é para o RC, mas acho que deve compilar multa contra ASP.NET MVC RTM.

Outras dicas

Eu sei que você já aceitou uma resposta, mas aqui está o que eu vim acima com ao experimentar com a mesma idéia, com a ajuda de Phil Haack pós .

Primeiro você precisa ter o seu próprio ViewEngine para procurar pastas em Ver pasta. Algo como isto: (Você vai notar que ele se parece muito com código de áreas de Phil Haack)

public class TestViewEngine : WebFormViewEngine
{
    public TestViewEngine()
        : base()
    {
        MasterLocationFormats = new[] {
            "~/Views/{1}/{0}.master",
            "~/Views/Shared/{0}.master"
        };

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

        PartialViewLocationFormats = ViewLocationFormats;
    }
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        ViewEngineResult rootResult = null;

        //if the route data has a root value defined when mapping routes in global.asax
        if (controllerContext.RouteData.Values.ContainsKey("root")) {
            //then try to find the view in the folder name defined in that route
            string rootViewName = FormatViewName(controllerContext, viewName);
            rootResult = base.FindView(controllerContext, rootViewName, masterName, useCache);
            if (rootResult != null && rootResult.View != null) {
                return rootResult;
            }
            //same if it's a shared view
            string sharedRootViewName = FormatSharedViewName(controllerContext, viewName);
            rootResult = base.FindView(controllerContext, sharedRootViewName, masterName, useCache);
            if (rootResult != null && rootResult.View != null) {
                return rootResult;
            }
        }
        //if not let the base handle it
        return base.FindView(controllerContext, viewName, masterName, useCache);
    }

    private static string FormatViewName(ControllerContext controllerContext, string viewName) {
        string controllerName = controllerContext.RouteData.GetRequiredString("controller");

        string root = controllerContext.RouteData.Values["root"].ToString();
        return "Views/" + root + "/" + controllerName + "/" + viewName;
    }

    private static string FormatSharedViewName(ControllerContext controllerContext, string viewName) {
        string root = controllerContext.RouteData.Values["root"].ToString();
        return "Views/" + root + "/Shared/" + viewName;
    }
}

Então em seu Global.asax substituir o ViewEngine padrão com seu um costume, em Application_Start:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new TestViewEngine());

Agora, quando você está definindo rotas em Global.asax, você precisa definir um valor root indicando a pasta para procurar sob a ótica pastas assim:

routes.MapRoute(
    "ListManager",
    "ListManager/{action}/{id}",
    new { controller = "ListManager", action = "Index", id = "", root = "Manage" }
 );

Esta questão é muito mais uma repetição do esta questão

então eu vou citar o meu resposta para essa pergunta aqui.

Eu vim com uma solução diferente que não me obrigar a fazer a minha própria vista do motor.

Basicamente, eu queria manter MVC como "Convenção" impulsionado possível, mas eu ainda queria organizar toda a minha vistas "admin" sob o ~ / Visualizações / Admin pasta.

Exemplo:

  • ~ / Visualizações / Admin / User /
  • ~ / Views / admin / Notícias /
  • ~ / Views / admin / blog /

A minha solução foi criar uma nova base classe para o meu administrador específica controladores e "força" o caminho para a visão para esse controlador.

Eu tenho um blog e código de exemplo aqui: Organize seus pontos de vista em ASP.Net MVC

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top