2011-10-25 21 views
5

Esto funciona en mi máquina de desarrollo, pero no en un servidor de producción. Estoy tratando de actualizar algunos divs con ajax, pero no están actualizados, aunque otras partes funcionan bien. Estoy usando IIS 6 en el servidor. Cuando depuro este código en el lado del servidor con firebug, no golpea ningún punto de interrupción que agregue a la función de éxito.Función de éxito de AJAX en el servidor

Guión:

function updateServiceInfo(nodeId) { 
     var id = { id: nodeId }; 
     $.ajax({ 
      url: '/ServiceInfo/ServiceInfoPartial', 
      type: 'GET', 
      data: id, 
      dataType: 'html', 
      success: function (data) { 
       $('#serviceInfoContent').html(data); 
      }, 
    error: function (request, error) { 

    } 
     }); 
    } 

Controlador:

public class ServiceInfoController : Controller 
    { 
     public ActionResult ServiceInfo() 
     { 
      return PartialView("ServiceInfo"); 
     } 

     public ActionResult ServiceInfoPartial(string id) 
     { 
      return PartialView("ServiceInfoPartial"); 
     } 
    } 

Vistas:

serviceinfopartial

@model string 
<p> 
    Немає опису</p> 

ServiceInfo

<div id="serviceInfo"> 
    <div id="ContainerPanel" class="ContainerPanel"> 
     <div id="serviceInfoHeader" class="collapsePanelHeader"> 
      <div id="dvHeaderText" class="HeaderContent"> 
       Опис сервісу</div> 
      <div id="dvArrow" class="ArrowClose"> 
      </div> 
     </div> 
     <div id="serviceInfoContent" class="serviceInfoContent"> 

     </div> 
    </div> 
</div> 

La respuesta que se devuelve en la consola es

GET http://localhost/Managers/GetManagers?nodeId=563344 404 Not Found 42ms 

Respuesta

12

Ahhhhhhhhhhhhhh, otra URL codificada:

url: '/ServiceInfo/ServiceInfoPartial', 

Nunca URLs hardcode de este tipo en una aplicación ASP.NET MVC.

Siempre ayudantes uso de URL para generarlos:

url: '@Url.Action("ServiceInfoPartial", "ServiceInfo")', 

o si se trata de un archivo JavaScript independiente donde no se puede utilizar ayudantes URL simplemente utilizan HTML5 Data- * atributos de algún elemento DOM:

<div id="serviceInfo" data-url="@Url.Action("ServiceInfoPartial", "ServiceInfo")"> 
... 
</div> 

y luego en su javascript simplemente:

url: $('#serviceInfo').data('url'), 

El motivo por el que su código no funciona cuando lo aloja en IIS es porque en IIS probablemente esté alojando su aplicación en un directorio virtual, por lo que la url correcta ya no es /ServiceInfo/ServiceInfoPartial, sino que es /YourAppName/ServiceInfo/ServiceInfoPartial. Esa es la razón por la que nunca debe codificar ninguna url y usar ayudantes para generarlos => es porque los ayudantes manejan estos casos. Otra ventaja del uso de ayudantes es que si luego decides cambiar el diseño de tus rutas en Global.asax, no necesitarás modificar todos tus archivos javascript, etc ... Tu administración de URL está centralizada en una sola ubicación.

+0

Sí, mi código javasript está en un archivo separado. y url: '@ Url.Action ("ServiceInfoPartial", "ServiceInfo")', no funciona. ¿Y su atrribute HTML5 funcionará, por ejemplo, en ie7? –

+0

@andronz, sí funcionará en IE7. Eso es lo que ASP.NET MVC 3 usa para la validación discreta del cliente y AJAX. Incluso si IE7 es basura y no es compatible con HTML5, jquery interpretará dichos atributos anexados a los elementos DOM. Y dado que IE7 nunca escuchó acerca de los atributos HTML5 o data- *, los ignoraría silenciosamente. –

+0

@DarinDimitrov, acerca de lo que escribió en un archivo js separado 1. ¿Por qué guarda la url en div en lugar de en el campo oculto? 2. Si lo hace, el javascript se combina con la vista, ¿no es así? – gdoron

0

Esto funcionó para mí, pero sólo probado en Chrome 53:

crear algunas variables de ámbito mundial en su archivo .cshtml, acaba de ser conscientes de los problemas de alcance y dar a sus variables de nombres únicos.

<script> 
    globalUrl = '@Url.Action("ServiceInfoPartial", "ServiceInfo")'; 
</script> 

después hacer referencia a su archivo js ...

<script type="text/javascript" src="yourJsFile.js"></script> 

Dentro de su yourJsFile.js:

url: globalUrl, 
Cuestiones relacionadas