2012-06-13 19 views
9

Esta es una aplicación MVC3. Tengo la siguiente llamada javascript para mi acción:JQuery llamada ajax a la acción MVC siempre devuelve un error cuando no hay una

function editDescription(docId,fileName, fileDescription) { 
    $.ajax({ 
     type: "POST", 
     url: "/OrderDetail/LoadModelData", 
     contentType: "application/json; charset=utf-8", 
     data: "{'id': '"+docId +"', 'filename': '"+fileName+"', 'description': '"+fileDescription+"'}", 
     dataType: "json", 
     success: function (result) { 
     alert("ok: "+ result.d); 
     }, 
     error: function (result) { 
      alert('Oh no: '+ result.responseText); 
     } 
    }); 

Heres mi acción:

[HttpPost] 
    public string LoadModelData(string id, string filename, string description) 
    { 
     return filename; 
    } 

corro el código, la acción se llama con los parámetros, nada es nula, pero la función de error se llamado todo el tiempo Entonces, la casilla de alerta con 'Oh no' aparece siempre, pero la cadena que se devuelve de la acción es correcta. Si el nombre del archivo es test.pdf el cuadro de alerta de error dice

'Oh No: test.pdf'. 

Miré en Firebug y no hay errores. ¿Por qué no se llama a la función de éxito a pesar de que no hay errores?

+0

El nombre del archivo. Eso está haciendo lo que se supone que debe hacer. La función de error sigue recibiendo llamadas y tarde o temprano se producirá un error real – BoundForGlory

Respuesta

11

Usted está esperando (devolver) un valor string desde su método de acción. ¿Por qué necesita especificar el tipo de datos como json? Eliminar eso y ver qué pasa. ¡Y no hay d propiedad de la respuesta! entonces solo use resultado en la alerta.

$.ajax({ 
     type: "POST", 
     url: "/OrderDetail/LoadModelData", 
     contentType:"application/json; charset=utf-8",   
     data: JSON.stringify({ 
          id: docId, 
          filename: fileName, 
          description: fileDescription 
          }), 
     success: function (result) { 
     alert("ok: "+ result); 
     }, 
     error: function (result) { 
      alert('Oh no: '+ result.responseText); 
     } 
    }); 

la propiedad datatype le dice al servidor que el tipo de contenido que el cliente está esperando atrás como el resultado.

EDIT: Como mencionó Darin, utilice el método JSON.stringify para compilar la solicitud JSON. Actualizando esta respuesta para incluir la forma correcta para futuros visitantes.

+0

que fue ... muchas gracias – BoundForGlory

+0

@ user1202717: Usted es Bienvenido. Me alegro de poder ayudar. :) – Shyju

+1

-1 por dejar la cadena JSON codificada en la solicitud de ajax. –

8

Nunca construir JSON con manipulaciones de cadena:

data: "{'id': '"+docId +"', 'filename': '"+fileName+"', 'description': '"+fileDescription+"'}", 

Eso es absolutamente horrible y el mal. No estás codificando nada. Basta una cita en el description y todo se romperá. Siempre use un analizador JSON JSON al manipular

De esta manera:

$.ajax({ 
    type: "POST", 
    url: "/OrderDetail/LoadModelData", 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify({ 
     id: docId, 
     filename: fileName, 
     description: fileDescription 
    }), 
    success: function (result) { 
     alert("ok: "+ result.filename); 
    }, 
    error: function (result) { 
     alert('Oh no: '+ result.responseText); 
    } 
}); 

El método JSON.stringify se construye en forma nativa los navegadores modernos. Si necesita admitir navegadores antiguos, puede incluir el script json2.js

Otro error es la firma de la acción de su controlador. En ASP.NET MVC, las acciones del controlador deben devolver ActionResults, no cadenas:

[HttpPost] 
public ActionResult LoadModelData(string id, string filename, string description) 
{ 
    return Json(new { filename = filename }); 
} 
+0

¿Qué hay de JsonResult regresado? – PositiveGuy

+0

@CoffeeAddict, ¿qué tal? –

Cuestiones relacionadas