2010-01-18 6 views

Respuesta

35

De acuerdo con el libro Professional ASP.NET MVC 1.0, la biblioteca MVC AJAX insertará un campo de formulario llamado "X- Solicitado: con "con un valor de" XMLHttpRequest ".

Luego, puede usar un método de extensión en System.Web.Mvc, lo que significa que simplemente puede llamar al Request.IsAjaxRequest() y obtener un simple verdadero o falso diciendo si se trata de una solicitud AJAX.

+0

Si bien esto será confiable en la mayoría de los casos, creo que el solicitante debe ser consciente de que esto * puede * ser falsificado fácilmente. –

+0

Tenga en cuenta: en un proyecto con una gran cantidad de solicitudes, recibí solicitudes Ajax al azar de navegadores móviles que tenían 'Request.IsAjaxRequest()' devolviendo false !!! Tuve que agregar un parámetro querystring (como 'partial = 1') a mis solicitudes para estar en el lado seguro. –

5

No hay una manera específica de determinar si la llamada fue realizada por javascript o directamente en el navegador, ya que es una llamada http regular.

Puede agregar un encabezado a su llamada ajax para distinguirlo de otras llamadas, o posiblemente agregar un parámetro a la cadena de consulta que solo se utiliza en llamadas ajax.

ASP.NET MVC ajax agrega tal encabezado - X-Requested-With: XMLHttpRequest, que puede usar para oler que se trata de una llamada ajax de la biblioteca mvc ajax. Sin embargo, si está utilizando jQuery o su propia mano hizo rodar llamadas ajax, esto no se establecerá. Además, otros clientes pueden falsificar este encabezado (usando WebClient, por ejemplo), por lo que encontrarlo no garantiza que se haya realizado una llamada ajax.

+0

+1 para sugerir un parámetro como en un proyecto con una gran cantidad de solicitudes, obtuve al azar solicitudes Ajax de navegadores móviles que tenían 'Request.IsAjaxRequest()' devolviendo falso !!! Tuve que agregar un parámetro querystring (como 'partial = 1') a mis solicitudes para estar en el lado seguro. –

0

Debería pasar algún parámetro con su llamada AJAX - AJAX es solo una solicitud GET, no es diferente a escribir una url en la barra de direcciones y presionar enter (esta es la razón por la que AJAX debe protegerse contra ataques de scripts cruzados, de lo contrario, un atacante puede obligar a las personas a ejecutar comandos AJAX en su sitio simplemente incluyendo la url en una imagen)

-7

¿Por qué es importante? No debería. ¿Estás realmente tratando de hacer una negociación de contenido?

+1

SÍ importa. Por ejemplo, es posible que no desee devolver una página HTML completa, sino solo una parcial. – jgauffin

+0

A continuación, agregue un parámetro a la url.Servir contenido diferente solo porque la solicitud se originó en un tipo diferente de cliente es un mal diseño. Este método bloquea ese comportamiento en las solicitudes ajax. ¿Qué sucede si luego desea obtener todo el contenido de la página a través de ajax (Oops, can not)? ¿Qué pasa si luego escribe una aplicación de escritorio que quiere contenido parcial? (Oops, tampoco puedo hacer eso, ya que no es una solicitud de AJAX). – Ryan

+0

¿Hablas en serio? ¿Por qué querrías buscar una página html completa sobre ajax? No hay nada que ganar en comparación con el uso de una solicitud normal. Escribir un cliente de escritorio que quiere contenido parcial? ¿Estás construyendo un navegador web? ;) 'Servir contenido diferente solo porque la solicitud se originó en un tipo diferente de cliente es un mal diseño' El cliente es el mismo, solo se obtiene la solicitud que difiere. – jgauffin

7

Puede comprobarlo manualmente así:

bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest"; 

O cuando estás en un controlador en ASP.NET MVC, que hace referencia a System.Web.Mvc obtendrá una extension-method en el HttpRequestBase objeto, al que puede acceder dentro de un ActionMethod así:

bool isAjaxRequest = Request.IsAjaxRequest(); 
+0

Tenga en cuenta: en un proyecto con una gran cantidad de solicitudes, recibí solicitudes Ajax al azar de navegadores móviles que tenían 'Request.IsAjaxRequest()' devolviendo false !!! Tuve que agregar un parámetro querystring (como 'partial = 1') a mis solicitudes para estar en el lado seguro. –

4

la mejor manera de comprobar si la petición es una petición AJAX es comprobar Request.IsAjaxRequest(). Es bueno saber que bajo el capó, el marco MVC verifica las solicitudes ajax en los parámetros de solicitud O en el encabezado de la solicitud. El código en el código fuente ASP.Net MVC es:

public static bool IsAjaxRequest(this HttpRequestBase request) { 
     if (request == null) { 
      throw new ArgumentNullException("request"); 
     } 

     return (request["X-Requested-With"] == "XMLHttpRequest") || ((request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest")); 
    } 

Así que si quieres comprobarlo mannually (no recomendado) usted tiene que comprobar ambos.

Cuestiones relacionadas