none
Tem como capturar o roteamento? RRS feed

  • Pergunta

  • Pessoal,

    Digo, o usuário clica em um botão, que manda para a View "Cadastro", preciso em um lugar centralizado pegar o nome desta View, ou seja, preciso algum evento onde ocorre o roteamento sob demanda, esse evento existe? Nele eu consigo capturar o nome da View?

    Ví que tem como eu criar um roteamento customizado, eu deveria seguir por este caminho?


    []´s
    Diego Koga
    segunda-feira, 8 de fevereiro de 2010 14:48

Respostas

  • Tem sim, segue abaixo um exemplo prático. Um sistema para gerar "Log" das requisições. Confere o método "Log" e a variável routeData do tipo RouteData.

        public class LogAttribute : ActionFilterAttribute
    {
    private void Log(string stageName, RouteData routeData, HttpContextBase httpContext)
    {
    string userIP = httpContext.Request.UserHostAddress;
    string userName = httpContext.User.Identity.Name;
    string reqType = httpContext.Request.RequestType;
    string reqData = GetRequestData(httpContext);
    string role = GetRoles(userName);

    string LogDataFile = ConfigurationManager.ConnectionStrings["LogDataFile"].ConnectionString;

    StringBuilder sb = new StringBuilder();
    sb.Append("insert into log_admin(Controller, Action, IP, User, Role, RequestType, RequestData, EventDate) values");
    sb.AppendFormat("('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}')",
    routeData.Values["controller"] ,
    routeData.Values["action"] ,
    userIP,
    userName,
    role,
    reqType,
    reqData,
    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
    );

    string sql = sb.ToString();
    SQLiteConnection cnn = new SQLiteConnection(LogDataFile);

    cnn.Open();

    SQLiteCommand mycommand = new SQLiteCommand(cnn);

    mycommand.CommandText = sql;

    mycommand.ExecuteNonQuery();

    cnn.Close();
    }

    private string GetRequestData(HttpContextBase context)
    {
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < context.Request.QueryString.Count; i++)
    {
    sb.AppendFormat("Key={0}, Value={1}<br/>", context.Request.QueryString.Keys[i], context.Request.QueryString[i]);
    }

    for (int i = 0; i < context.Request.Form.Count; i++)
    {
    sb.AppendFormat("Key={0}, Value={1}<br/>", context.Request.Form.Keys[i], context.Request.Form[i]);
    }

    return sb.ToString();
    }
    }
    Suprimi alguns métodos porque para exemplo eles seriam irrelevantes.

    Cria a classe basta depois vc "decorar" seus métodos com o atributo [Log] para executar o action filter
    segunda-feira, 8 de fevereiro de 2010 18:52
    Moderador
  • Saquei...

    Você já tentou com os Action Filter's ?
    Acho que pode te atender... Veja aqui .



    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    segunda-feira, 8 de fevereiro de 2010 17:04
    Moderador

Todas as Respostas

  • Fala Diego,

    Não sei quanto aos colegas, mas eu não consegui entender a questão...
    Poderia explicar um pouco melhor a sua necessidade?


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    segunda-feira, 8 de fevereiro de 2010 16:04
    Moderador
  • Vamos lá...

    Preciso executar o método "VerificaQualquerCoisa" quando houver uma requisição do tipo "http://www.meusite.com.br/Cadastro" ou "http://www.meusite.com.br/QualquerView", mas não gostaria de tratar em cada Controller, pois a chamada do método acabaria se duplicando pelos Controllers, entendeu?

    Então imagine de capturar o roteamento, qual o ASP.NET for Rotear a requisição fazer esta chamada, não sei se é o local apropriado e se existe este local..


    []´s

    Diego Koga
    segunda-feira, 8 de fevereiro de 2010 16:53
  • Saquei...

    Você já tentou com os Action Filter's ?
    Acho que pode te atender... Veja aqui .



    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    segunda-feira, 8 de fevereiro de 2010 17:04
    Moderador
  • Tem sim, segue abaixo um exemplo prático. Um sistema para gerar "Log" das requisições. Confere o método "Log" e a variável routeData do tipo RouteData.

        public class LogAttribute : ActionFilterAttribute
    {
    private void Log(string stageName, RouteData routeData, HttpContextBase httpContext)
    {
    string userIP = httpContext.Request.UserHostAddress;
    string userName = httpContext.User.Identity.Name;
    string reqType = httpContext.Request.RequestType;
    string reqData = GetRequestData(httpContext);
    string role = GetRoles(userName);

    string LogDataFile = ConfigurationManager.ConnectionStrings["LogDataFile"].ConnectionString;

    StringBuilder sb = new StringBuilder();
    sb.Append("insert into log_admin(Controller, Action, IP, User, Role, RequestType, RequestData, EventDate) values");
    sb.AppendFormat("('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}')",
    routeData.Values["controller"] ,
    routeData.Values["action"] ,
    userIP,
    userName,
    role,
    reqType,
    reqData,
    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
    );

    string sql = sb.ToString();
    SQLiteConnection cnn = new SQLiteConnection(LogDataFile);

    cnn.Open();

    SQLiteCommand mycommand = new SQLiteCommand(cnn);

    mycommand.CommandText = sql;

    mycommand.ExecuteNonQuery();

    cnn.Close();
    }

    private string GetRequestData(HttpContextBase context)
    {
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < context.Request.QueryString.Count; i++)
    {
    sb.AppendFormat("Key={0}, Value={1}<br/>", context.Request.QueryString.Keys[i], context.Request.QueryString[i]);
    }

    for (int i = 0; i < context.Request.Form.Count; i++)
    {
    sb.AppendFormat("Key={0}, Value={1}<br/>", context.Request.Form.Keys[i], context.Request.Form[i]);
    }

    return sb.ToString();
    }
    }
    Suprimi alguns métodos porque para exemplo eles seriam irrelevantes.

    Cria a classe basta depois vc "decorar" seus métodos com o atributo [Log] para executar o action filter
    segunda-feira, 8 de fevereiro de 2010 18:52
    Moderador
  • John Prado,

    Rapaz... muito interessante este código rs, vou até aproveitar a idéia para gerar um log aqui também ;)
    Muito bom valeu ;)
    segunda-feira, 8 de fevereiro de 2010 19:19
  • Marca como resposta, please! :P
    segunda-feira, 8 de fevereiro de 2010 19:42
    Moderador
  • Rapaz... muito interessante este código rs, vou até aproveitar a idéia para gerar um log aqui também ;)

    Olá Leonardo,

    Antes que você desenvolva um mecanismo de log customizado, recomendo dar uma olhada no ELMAH ;)

    ELMAH: Error Logging Modules and Handlers for ASP.NET (and MVC too!)
    http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx


    Abraços,
    Caio Proiete

     

    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://www.caioproiete.com

    segunda-feira, 8 de fevereiro de 2010 20:43
    Moderador
  • Olá Caio,

    Nossa, rsrs eu tava pensando em usar só a idéia do Filter com o log4net, mas elsse ELMAH tá me parecendo o "super phodastico" rsrs
    Vou estudar um pouco mais ele!!

    Valeu!
    terça-feira, 9 de fevereiro de 2010 00:40
  • Olá Caio,

    Nossa, rsrs eu tava pensando em usar só a idéia do Filter com o log4net, mas elsse ELMAH tá me parecendo o "super phodastico" rsrs
    Vou estudar um pouco mais ele!!

    Valeu!

    ELMAH rodando!!
    Muito bom hien!!!
    Agora é só aprender a configurar melhor a criança!!!

    VLW!
    terça-feira, 9 de fevereiro de 2010 12:34
  • André e John, muito obrigado, deu certo, consegui fazer da maneira que queria!!!

    Agora, seguindo a mesma linha, é possível capturar quando um controle está sendo renderizado?

    Digo, por exemplo, que executar um método antes do controle "text" ser renderizado para saber se o usuário logado irá visualisar este controle ou não para colocar true ou false no visible...



    Vlw...
    Diego Koga
    quarta-feira, 10 de fevereiro de 2010 11:51
  • Pessoal,

    Depois que eu decorei o meu Controller com o ActionFilter, começou a ocorrer este erro também: http://social.msdn.microsoft.com/Forums/pt-BR/mvcpt/thread/b0a16581-179e-4493-b602-09b49f69aaba


    Ele já acontecia por si só em uma determinada view, agora começou a acontecer em outra que estava funcionando sem problemas, detalhe, mesmo que eu deixe o método vazio o erro ocorre, o erro é este:


    Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster. body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px} b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px} H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red } H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon } pre {font-family:"Lucida Console";font-size: .9em} .marker {font-weight: bold; color: black;text-decoration: none;} .version {color: gray;} .error {margin-bottom: 10px;} .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }

    Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.

    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.

    Exception Details: System.Web.HttpException: Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.

    Source Error:

    [No relevant source lines]

    Source File: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\e949bd90\9a70cdc\App_Web_azhsmdni.0.cs    Line: 0

    Stack Trace:

    [HttpException (0x80004005): Unable to validate data.]
       System.Web.Configuration.MachineKeySection.GetDecodedData(Byte[] buf, Byte[] modifier, Int32 start, Int32 length, Int32& dataLength) +289
       System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) +140
    
    [ViewStateException: Invalid viewstate. 
    	Client IP: 127.0.0.1
    	Port: 
    	User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET CLR 1.1.4322; MS-RTC LM 8)
    	ViewState: /wEPDwULLTEwODAzMjk5MjJkZFC+K3rucGRL6kgt6z2p86Z/jkty
    	Referer: http://localhost:1875/default.aspx
    	Path: /default.aspx]
    
    [HttpException (0x80004005): Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.]
       System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) +106
       System.Web.UI.ViewStateException.ThrowMacValidationError(Exception inner, String persistedState) +14
       System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) +242
       System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) +4
       System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) +37
       System.Web.UI.HiddenFieldPageStatePersister.Load() +207
       System.Web.UI.Page.LoadPageStateFromPersistenceMedium() +105
       System.Web.UI.Page.LoadAllState() +43
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +6785
       System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +242
       System.Web.UI.Page.ProcessRequest() +80
       System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) +21
       System.Web.UI.Page.ProcessRequest(HttpContext context) +49
       ASP.default_aspx.ProcessRequest(HttpContext context) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\e949bd90\9a70cdc\App_Web_azhsmdni.0.cs:0
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
    


    []´s
    Diego Koga
    quarta-feira, 10 de fevereiro de 2010 13:49
  • Afinal de contas, é resposta o meu post ou não???
    quarta-feira, 10 de fevereiro de 2010 19:16
    Moderador
  • Foi sim cara, sinceramente não sei o que aconteceu...

    Entrei agora pra ver e só aparece a opção para desmarcar a resposta!!! Acho que é por que o Caio marcou...


    Valeu pela ajuda!!!

    []´s
    Diego Koga
    quinta-feira, 11 de fevereiro de 2010 19:13
  • Foi sim cara, sinceramente não sei o que aconteceu...

    Entrei agora pra ver e só aparece a opção para desmarcar a resposta!!! Acho que é por que o Caio marcou...


    Valeu pela ajuda!!!

    []´s
    Diego Koga

    Diego,

    - Sugerido como Resposta Caio Proiete [MVP] MVP, Moderador segunda-feira, 8 de fevereiro de 2010 20:44 
    - Marcado como Resposta Koga, Diego  quarta-feira, 10 de fevereiro de 2010 11:49 
    Não Marcado como Resposta Koga, Diego  quarta-feira, 10 de fevereiro de 2010 17:25 
    - Marcado como Resposta Caio Proiete [MVP] MVP, Moderador há 23 horas 56 minutos

    Abraços,
    Caio Proiete

     

    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://www.caioproiete.com

    quinta-feira, 11 de fevereiro de 2010 20:05
    Moderador
  • Sem stress pessoal...

    Só que uns pontinhos a mais não fazem mal a ninguém né?

    :P
    quinta-feira, 11 de fevereiro de 2010 21:12
    Moderador