Pergunta

Eu estou tentando impliment um motor de exibição personalizada para servir exibições móveis com base no agente do usuário. Estou seguindo a abordagem de Scott Hanselman de este post .

Eu herdei do WebFormsViewEngine e substituído o método FindView da mesma forma que Scott descreve em seu blog.

Eu adicionei então algumas linhas para o meu método Global.asax Application_Start para limpar a coleção mecanismo de exibição e adicionar uma nova instância do meu mecanismo de exibição.

Depois de alguns testes, parece que MVC está ignorando meu motor vista. Quando ele não conseguiu encontrar as minhas exibições personalizadas com base no agente de usuário do navegador eu recorri para codificar o caminho personalizado para anexar à vista e ainda conseguiu voltar a cair a exibição padrão. Eu definir um ponto de interrupção no meu método FindView e com certeza, ele não está sendo chamado em tudo.

Como posso obter o meu motor de exibição personalizada para o trabalho? Qualquer ajuda será muito apreciada.

meu ponto de vista motor esta aparência:

public class MyViewEngine: WebFormsViewEngine
{
    public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;

         //Serve a special view for iPhones
         if (UserAgentIs(controllerContext, "iPhone"))
         {
              result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         }

         //If no special view is found, fall back to the default view
         if (result == null || result.View == null)
         {
              result = base.FindView(controllerContext, viewName, masterName, useCache);
         }

         return result;
    }

    private bool UserAgentIs(ControllerContext controllerContext, string userAgentToTest)
    {
         return (controllerContext.HttpContext.Request.UserAgent.IndexOf(userAgentToTest, StringComparison.OrdinalIgnoreCase) > 0);
    }
}

E na minha Global.asax:

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MyViewEngine());
}

Quando esta configuração não funciona Eu até tentei simplificar o meu método FindView a esta:

public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;
         result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         return result;
    }

E isso não quer trabalhar. Ele ainda voltou a exibição padrão. E sim, a página de visualização e página mestra que deve ser encontrado por essa afirmação não existem realmente. Estou muito perplexo por que isso não está funcionando.

Foi útil?

Solução

Bem, este é certamente embaraçoso:

Quando eu escrevi o meu motor de vista eu estava seguindo o blog de Scott Hanselman (ver o meu post original para o link). I delcared minha classe mecanismo de exibição, em seguida, decidi que iria simplesmente copiar e colar o código de Scott em minha classe e modificar conforme necessário. Eu acidentalmente copiado seu código com a definição de classe em minha classe criando uma classe aninhada. Portanto o meu mecanismo de exibição não contêm realmente uma substituição para o método FindView e, naturalmente, a da classe aninhada nunca iria ser chamado!

A lição: quando usando o código encontrado em linha não copiar e colar! Sempre digite você mesmo.

Obrigado a todos que verifique esta questão e tentou me ajudar.

Eu vou ficar no canto de vergonha e embaraço agora!

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