2011-10-25 12 views
5

Questo funziona sulla mia macchina di sviluppo, ma non su un server di produzione. Sto cercando di aggiornare alcuni div con ajax, ma non vengono aggiornati, anche se altre parti funzionano bene. Sto usando IIS 6 sul server. Quando eseguo il debug di questo codice sul lato server con firebug, non ha alcun punto di interruzione che aggiungo alla funzione success.AJAX Success Function sul server

Script:

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) { 

    } 
     }); 
    } 

controllore:

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

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

Visualizzazioni:

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 risposta che viene restituita nella console è

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

risposta

12

Ahhhhhhhhhhhhhh, un altro URL hardcoded:

url: '/ServiceInfo/ServiceInfoPartial', 

Mai gli URL hardcode come questo in un'applicazione ASP.NET MVC.

sempre aiutanti uso URL per generare loro:

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

o se questo è in un file JavaScript separato dove non è possibile utilizzare gli helper URL semplicemente utilizzare HTML5 dati- * attributi su qualche elemento DOM:

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

e poi nel tuo javascript semplicemente:

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

Il motivo per cui il codice non funziona quando lo si ospita in IIS è perché in IIS probabilmente si ospita l'applicazione in una directory virtuale, pertanto l'URL corretto non è più /ServiceInfo/ServiceInfoPartial ma è /YourAppName/ServiceInfo/ServiceInfoPartial. Questo è il motivo per cui non devi mai hardcode alcun URL e utilizzare gli helper per generarli => è perché gli helper gestiscono questi casi. Un altro vantaggio dell'utilizzo di helper è che se in seguito deciderai di modificare il layout dei tuoi percorsi in Global.asax non avrai bisogno di modificare tutti i tuoi file javascript, ecc ... La tua gestione url è centralizzata in un'unica posizione.

+0

Sì, il mio codice javasript è in un file separato. e url: '@ Url.Action ("ServiceInfoPartial", "ServiceInfo")', non funziona. E questo atrribute HTML5 funzionerà per esempio ie7? –

+0

@andronz, sì, funzionerà in IE7. Ecco cosa utilizza già la validazione client discreta di ASP.NET MVC 3 e AJAX. Anche se IE7 fa schifo e non supporta HTML5, jquery interpreterà felicemente quegli attributi aggiunti agli elementi DOM. E poiché IE7 non ha mai sentito parlare di attributi HTML5 o data- *, li ignorerebbe silenziosamente. –

+0

@DarinDimitrov, su ciò che hai scritto sul file js separato 1. Perché salvi l'url in div anziché in campo nascosto? 2. Se lo fai, il javascript è accoppiato con la vista, non è vero? – gdoron

0

questo ha funzionato per me, ma testato solo in Chrome 53:

Creare alcune variabili di ambito globale nel file .cshtml, basta essere consapevoli dei problemi di portata e dare le variabili nomi univoci.

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

quindi fare riferimento il file js ...

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

All'interno della vostra yourJsFile.js:

url: globalUrl, 
Problemi correlati