2011-01-18 7 views
5

Tengo un hipervínculo que necesito registrar cuando se hace clic.¿Cómo puedo registrar un enlace?

Creé un pequeño prototipo, y el problema se puede repetir creando un nuevo proyecto de aplicación web MVC 2.

Añadir

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 

al archivo Site.Master.

Y

public ActionResult LogSomething() 
{ 
    string doNothing = DateTime.Now.ToString(); 
    return new EmptyResult(); 
} 

a los HomeController.cs el archivo

Ponga un punto de quiebre en la LogSomething() la acción

Y

<p> 
    <a id="lnkTestPost" href="/home/about">Test Post</a> 

    <script type="text/javascript"> 
     $("#lnkTestPost").click(function() { 
      $.post("/home/LogSomething"); 
     }); 
    </script> 
</p> 

en Inicio/Index.aspx método en el HomeController.

Pero cuando lo ejecuto, a veces se golpea el punto de interrupción, otras veces no lo es.

Supongo que no está siendo golpeado debido al enlace real que envía el navegador a otra página, pero ¿no debería publicarse antes de que se active el enlace?

¿De todos modos puedo asegurarme de que el código de registro se active?

Tenga en cuenta; agregar la funcionalidad de registro en el destino del enlace no es una opción.

EDITAR: El hipervínculo original es en realidad un protocolo personalizado para una aplicación instalada en la PC del usuario. Entonces el enlace es algo así como "myapp: myArgs". No mencioné eso para mantener las cosas simples, lamentablemente, ya que ninguna de las respuestas realmente se aplica a mí, ahora creo que es necesario mencionarlo.

Respuesta

1

Creo que el navegador podría navegar fácilmente a la URL antes de iniciar sesión. ¿Qué tal:

<p> 
    <a id="lnkTestPost" href="#">Test Post</a> 

    <script type="text/javascript"> 
     $("#lnkTestPost").click(function() { 
      $.post("/home/LogSomething", function(data) { 
       // only tell the browse to navigate away once its logged 
       window.location = '/home/about'; 
      }); 
     }); 
    </script> 
</p> 
+0

Lo intenté, pero no siempre funciona –

+1

Además, eso se romperá horriblemente con, por ejemplo, "abrir en una pestaña nueva". –

+0

@John, ¿de qué manera no siempre funciona? No sufre los problemas de sincronización que tiene tu código. –

0

Un enfoque que he visto utilizado por muchos sitios, como Google, es tener una página "redirector", por lo que todos los enlaces ir a través de esa página/controlador, inicia una sesión que, a continuación, a partir allí puede redirigirlos

10

Si lo estuviera haciendo, probablemente haría lo que, por ejemplo, hace Google y configuraría una URL que registra y luego redirige. Por ejemplo:

<a href="/home/about">stuff</a> 
<script> 
    $("a:href").each(function(){ 
     this.attr("href", "/log?url=" + encodeURIComponent(this.attr("href"))); 
    }); 
</script> 

Entonces /log manejador haría algo así:

def log(request): 
    target_url = request.GET["url"] 
    log_link(target_url) 
    return HttpRedirect(target_url) 

Usted había necesidad de poner algún pensamiento en tratar con los enlaces externos (por ejemplo, cómo desea manejar http://example.com/log?url=http://evil.com/) ... Pero ese es un problema solucionable

Además, para obtener puntos de bonificación, puede cambiar la URL al hacer clic en el enlace (esto es lo que hace Google en sus resultados de búsqueda), por lo que la vista previa del enlace del mouse parece correcta.

+0

+1 pure evil :) – zack

+0

... y ser más malvado: 'var oldUrl = this.attr (" href "), self = this; setTimeout (function() {self.attr ("href", oldUrl)}, 10) ' –

+0

lol. Me gusta cómo escribiste una función de vista de estilo django incluso si está etiquetada como .net mvc – mpen

3

Como alternativa, puede hacer lo que hace Google Reader, y poner un "de URL" en cada enlace:

<script> 
$("a:href").each(function(){ 
    this.attr("href", this.attr("href") + "?from=" + encodeURIComponent(window.location)); 
    // (note: this exact code won't handle links which already have GET vars…) 
}); 
</script> 

A continuación, utilice algunos de middleware para registrar el "de" en las solicitudes entrantes.

Esto tiene la desventaja de que no podrá registrar clics yendo a otro dominio ... Pero eso podría estar bien.

0

¿Qué tal un parm de "registro" opcional en cada página que se incluye como parte de los enlaces para que no tenga que tener ningún Javascript? De acuerdo, cada página podría estar registrando algo de la página de referencia, pero no debería importarle, ya que podría hacer que pase lo que esté en el parrón de registro al registro de entrada y continuar.

Cuestiones relacionadas