2008-11-14 21 views
8

Prefiero usar jQuery con mis aplicaciones ASP.NET MVC que con la biblioteca Microsoft Ajax. He estado agregando un parámetro llamado "modo" a mis acciones, que configuré en mis llamadas ajax. Si se proporciona, devuelvo un JsonViewResult. Si no se proporciona, supongo que era una publicación Http estándar y devuelvo ViewResult.¿Hay un equivalente Request.IsMvcAjaxRequest() para jQuery?

Me gustaría poder utilizar algo similar a IsMvcAjaxRequest en mis controladores cuando uso jQuery para poder eliminar el parámetro extra en mis acciones.

¿Hay algo por ahí que proporcione esta capacidad dentro de mis controladores o alguna forma simple de lograrlo? No quiero volverme loco escribiendo código ya que al agregar un solo parámetro funciona, simplemente no es ideal.

+0

para cualquier persona confusa Se ha cambiado el nombre de IsMvcAjaxRequest (a partir de RC1) por el de IsAjaxRequest solo para hacerlo compatible con otras bibliotecas de Ajax. por favor, vea mi publicación a continuación –

Respuesta

12

He aquí un excepto de notas de la versión RC1 MVC - Jan 2009

IsMvcAjaxRequest renombrado a IsAjaxRequest

El método IsMvcAjaxRequest sido renombrado a IsAjaxRequest. Como parte de este cambio, se actualizó el método IsAjaxRequest para reconocer el encabezado HTTP X-Requerido-Con. Esto es un encabezado bien conocido enviado por las principales bibliotecas de JavaScript como Prototype.js, jQuery y Dojo.

Los ayudantes ASP.NET AJAX se actualizaron para enviar este encabezado en solicitudes. Sin embargo, continúan en y también lo envían en el cuerpo de la publicación con el fin de evitar el problema de cortafuegos que desvían los encabezados desconocidos.

En otras palabras, se renombró específicamente para ser más "compatible" con otras bibliotecas.

Además, para cualquier persona que ya no haya leído el full release notes pero ha estado utilizando versiones anteriores - incluso tan reciente como el beta - Me ENFÁTICAMENTE recomiendo que las lean en su totalidad. Le ahorrará tiempo en el futuro y lo más probable es que lo entusiasme con algunas de las nuevas funciones. Es bastante sorprendente la cantidad de cosas nuevas que hay allí.

Nota importante: Usted tendrá que asegurarse de actualizar el archivo .js para MicrosoftAjax.MVC (no el nombre exacto) si se actualiza a RC1 de la Beta - de lo contrario este método no funcionará. No aparece en las notas de la versión como una tarea obligatoria para la actualización, así que no lo olvides.

+0

Gracias Simon, con suerte Andrew Van Slaars le dará la respuesta aceptada. –

+0

Además, cambié mi publicación a la wiki de la comunidad en caso de que otros quieran actualizar la "Respuesta Aceptada" –

+0

gracias. estoy seguro de que mi respuesta estará obsoleta algún día :) ni siquiera había oído de ASP.NET MVC cuando escribiste tu respuesta :) –

4

Consulte la respuesta de Simons a continuación. El método que describo aquí ya no es necesario en la última versión de ASP.NET MVC.

La forma en que el método de extensión IsMvcAjaxRequest funciona actualmente es que comprueba Request["__MVCASYNCPOST"] == "true", y solo funciona cuando el método es una solicitud HTTP POST.

Si realiza solicitudes HTTP POST a través de jQuery, puede insertar dinámicamente el valor __MVCASYNCPOST en su solicitud y, a continuación, puede aprovechar el método de extensión IsMvcAjaxRequest.

Aquí está un link to the source of the IsMvcAjaxRequest extension method para su conveniencia.

Alternativamente, se podría crear un clon del método IsMvcAjaxRequest extensión llamada IsjQueryAjaxRequest que comprueba Request["__JQUERYASYNCPOST"] == "true" y se podía insertar dinámicamente ese valor en el HTTP POST.

actualización

decidí seguir adelante y dar a este un tiro aquí es lo que ocurrió.

Método de extensión

public static class HttpRequestBaseExtensions 
{ 
    public static bool IsjQueryAjaxRequest(this HttpRequestBase request) 
    { 
     if (request == null) 
      throw new ArgumentNullException("request"); 

     return request["__JQUERYASYNCPOST"] == "true"; 
    } 
} 

Comprobación de una acción si un método es un jQuery $ .ajax() solicitud:

if (Request.IsjQueryAjaxRequest()) 
    //some code here 

JavaScript

$('form input[type=submit]').click(function(evt) { 
    //intercept submit button and use AJAX instead 
    evt.preventDefault(); 

    $.ajax(
     { 
      type: "POST", 
      url: "<%= Url.Action("Create") %>", 
      dataType: "json", 
      data: { "__JQUERYASYNCPOST": "true" }, 
      success: function(data) {alert(':)');}, 
      error: function(res, textStatus, errorThrown) {alert(':(');} 
     } 
    ); 
}); 
+0

¿Debo pasar el __JQUERYASYNCPOST como cualquier otro parámetro en mis datos de publicación cuando uso "$ .post"? Si es así, eso me daría la misma configuración básica sin el parámetro extra, que sería perfecto. –

+0

Perfecto, gracias! –

+0

Sí, pase los valores en el parámetro de datos de $ .post(). Primero probaría con __MVCASYNCPOST para asegurarme de que funciona con los métodos de extensión existentes. Si lo hace, puede implementar su propio método de extensión y cambiarlo a __JQUERYASYNCPOST. –

0

Ok, yo he tomado este paso un paso más allá y modificó mi archivo jQuery para cargar el parámetro adicional en los datos de la publicación, por lo que no tengo que repetir el "__JQUERYASYNCPOST: verdadero" para cada llamada a publicar. Para cualquiera que esté interesado, aquí está lo que mi nueva definición de $ .post se parece a:

post: function(url, data, callback, type) { 
      var postIdentifier = {}; 
      if (jQuery.isFunction(data)) { 
       callback = data; 
       data = {}; 
      } 
      else { 
       postIdentifier = { __JQUERYASYNCPOST: true }; 
       jQuery.extend(data, postIdentifier); 
      } 

      return jQuery.ajax({ 
       type: "POST", 
       url: url, 
       data: data, 
       success: callback, 
       dataType: type 
      }); 
     } 

que añade la variable "postIdentifier", así como la llamada a jQuery.extend. Ahora el Ayudante explicado en la respuesta de spoon16 funciona sin tener que agregar nada especial a mi código jQuery de nivel de página.

+0

bueno ... este es uno de los controles de calidad más completos en SO :) –

+0

What si extendiste 'ajax()'? ¿No sería mejor ya que todos los otros métodos como 'post()' solo llaman a 'ajax'? –

+0

Podría haber extendido ajax, pero mi preocupación principal es publicar. Normalmente, solo uso get para Ajax si es una característica solo de ajax, como una búsqueda autocompletada o una funcionalidad similar que no estaría disponible sin ajax, así que para esas cosas, utilizo JsonResult de todos modos. –

3

¿Por qué no simplemente verifica el encabezado HTTP "X-Requested-With" enviado automáticamente por la mayoría de las bibliotecas de Javascript (como jQuery)?

Tiene el valor 'XMLHttpRequest' cuando se envía una solicitud GET o POST.

Con el fin de probar que sólo debería tener que verificar el NameValueCollection "Request.Headers" en su acción, es decir:

if (Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
    return Json(...); 
else 
    return View(); 

De esta manera, sólo tiene que diferenciar las peticiones del navegador regulares de peticiones Ajax.

+0

Gran idea. Voy a abstenerme de cambiar mi respuesta para que pueda obtener la mayor cantidad posible de rep .: :) –

+0

No sabía que el encabezado solicitado estaba allí. Lo verificaré y lo intentaré, tal vez actualice el método de extensión para verificarlo. ¿Alguna idea de por qué MSFT no habría hecho esto para empezar? –

+0

En realidad, que yo sepa hay una falta de estandarización con respecto a este tema. Todas las bibliotecas construyen sus encabezados de manera diferente (algunos especifican la versión de la biblioteca), pero afortunadamente la mayoría ha adoptado 'X-Requerido-Con', no puedo decir por qué Microsoft no lo ha hecho. – Franck

Cuestiones relacionadas