section - razor javascript
¿Existe un Request.IsMvcAjaxRequest() equivalente para jQuery? (4)
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.
Me gustaría poder utilizar algo similar a IsMvcAjaxRequest en mis controladores cuando uso jQuery para poder eliminar el parámetro adicional 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.
¿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.
Para probarlo, solo debe comprobar la NameValueCollection "Request.Heading" en su acción, es decir:
if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
return Json(...);
else
return View();
De esta manera, puedes simplemente diferenciar las solicitudes regulares del navegador de las solicitudes Ajax.
Bien, he dado un paso más y he modificado 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: true" para cada llamada a publicar. Para cualquiera que esté interesado, así es como se ve mi nueva definición para $ .post:
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
});
}
Agregué 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.
Vea 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 está realizando 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í hay un enlace al origen del método de extensión IsMvcAjaxRequest para su conveniencia.
Alternativamente, puede crear un clon del método de extensión IsMvcAjaxRequest
llamado IsjQueryAjaxRequest
que comprueba Request["__JQUERYASYNCPOST"] == "true"
y puede insertar dinámicamente ese valor en HTTP POST.
Actualizar
Decidí seguir adelante y dar una oportunidad aquí es lo que se me 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";
}
}
Comprobando desde una acción si un método es una solicitud jQuery $ .ajax ():
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('':('');}
}
);
});
Aquí hay una excepción de las notas de la versión MVC RC1 - Jan 2009
IsMvcAjaxRequest ha cambiado el nombre a IsAjaxRequest
El método IsMvcAjaxRequest se renombró a IsAjaxRequest. Como parte de este cambio, el método IsAjaxRequest se actualizó para reconocer el encabezado X de X-Requested-With. Este 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 las solicitudes. Sin embargo, también continúan enviándolo en el cuerpo de la publicación del formulario para evitar el problema de los cortafuegos que desvían los encabezados desconocidos.
En otras palabras, fue específicamente renombrado para ser más ''compatible'' con otras bibliotecas.
Además, para cualquier persona que no haya leído las notas de la versión completa pero que haya estado usando versiones anteriores, incluso tan recientes como la versión beta, ESFUERZO que recomiendo que las lea 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: Deberá asegurarse de actualizar el archivo .js para MicrosoftAjax.MVC (no el nombre exacto) si se actualiza a RC1 desde la versión 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.