2011-02-18 14 views
5

Estoy trabajando en una aplicación MVC 3 con motor ASPX y como punto de partida desarrollé una búsqueda simple que utiliza una llamada JQuery JSON para recuperar algo de información. La llamada envía un parámetro tomado de una entrada de texto y actualiza una tabla con los resultados. La mirada del funcion de esta manera:llamada MVC 3 JSON no funciona en IIS

 function PerformLookup() { 
      var _accountNumber = $('#accountNumber').val(); 

      $.ajax({ 
       url: '/SearchAjax/SearchAccount', 
       type: 'POST', 
       data: '{_accountNumber:'+_accountNumber+'}', 
       dataType: 'json', 
       contentType: 'application/json; charset=utf-8', 
       success: function (data) { 
        UpdateTable(data); 
       }, 
       error: function() { 
        alert('An error occurred while performing the search.'); 
       } 
      }); 

      return false; 
     } 

el código del servidor ejecuta una consulta con ese parámetro y devuelve una lista que se serializado a JSON para ser trabajado con normalidad con jQuery. El código del servidor tiene el siguiente aspecto:

 [HttpPost] 
     public JsonResult SearchAccount(string _accountNumber) 
     { 
      MLIBEntities dbMLIB = new MLIBEntities(); 

      var searchResults = (from s in dbMLIB.Sets 
           where s.setmap1 == _accountNumber 
           select s); 
      return Json(searchResults.ToList()); 
     } 

Como se puede ver que no es nada difícil y funciona perfectamente cuando corro el proyecto de VS2010 y el uso de su máquina virtual.

El problema ocurre cuando publico el proyecto en un servidor de Windows 2008 con IIS 7. El proyecto se ejecuta normalmente pero cuando ejecuto la función PerformLookup aparece el mensaje "Ocurrió un error al realizar la búsqueda", lo que significa que la llamada ajax ha fallado.

¿Alguien tiene alguna idea de por qué la llamada está fallando en el IIS mientras funciona perfectamente en la máquina virtual VS2010? ¿Me falta alguna configuración de IIS?

¡Gracias de antemano!

+0

¿Usted intentó herramientas usnig como violinista/HttpWatch/Firebug para comprobar cuál es el contenido de la respuesta de llamada AJAX. Puede que tenga alguna información relevante que pueda ayudar a depurar aún más. –

Respuesta

10

Nunca codificar las direcciones URL como esta, porque al implementar su aplicación podría haber un directorio virtual antepuesto a sus URL:

url: '/SearchAjax/SearchAccount', 

Use siempre ayudantes URL cuando se trata de direcciones URL:

url: '<%= Url.Action("SearchAccount", "SearchAjax") %>', 

Así así es como refactorizaría su código:

function PerformLookup() { 
    var _accountNumber = $('#accountNumber').val(); 
    $.ajax({ 
     url: '<%= Url.Action("SearchAccount", "SearchAjax") %>', 
     type: 'POST', 
     data: JSON.stringify({ _accountNumber: _accountNumber }), 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { 
      UpdateTable(data); 
     }, 
     error: function() { 
      alert('An error occurred while performing the search.'); 
     } 
    }); 
    return false; 
} 

o si este PerformLookup función se llama cuando se hace clic en algún enlace, lo habría hecho el vínculo generado con un asistente de HTML:

<%= Html.ActionLink(
    "Perform search", 
    "SearchAccount", 
    "SearchAjax", 
    null, 
    new { id = "search" } 
) %> 

y luego simplemente AJAXify que:

$(function() { 
    $('#search').click(function() { 
     var _accountNumber = $('#accountNumber').val(); 
     $.ajax({ 
      url: this.href, 
      type: 'POST', 
      // Probably no need to send JSON request 
      // so I've replaced it with a standard 
      // application/x-www-form-urlencoded POST request 
      data: { _accountNumber: _accountNumber }, 
      dataType: 'json', 
      success: function (data) { 
       UpdateTable(data); 
      }, 
      error: function() { 
       alert('An error occurred while performing the search.'); 
      } 
     }); 
     return false; 
    }); 
}); 

Y finalmente yo recomendaría fuertemente usando FireBug que es una excelente herramienta que le permite depurar este tipo de problemas, ya que muestra todas las solicitudes de AJAX y lo que está sucediendo entre el cliente y el servidor.

+2

Utilicé el primer refactorizador que presente con el asistente de URL y la función JSON.stringify y funcionó como un hechizo de IIS. Muchas gracias, seguro que sabes lo que estás haciendo. – Alvos

0

sólo hay que poner la URL completa en javascript:

$.ajax({ 
    type: "POST", 
    url: "/Appnamehere/Controller/Action", ... 

este trabajo bien ..

Cuestiones relacionadas