2011-10-10 5 views
7

Ho un'applicazione Web ASP.NET MVC in esecuzione da http://localhost/myappname. Da jQuery, faccio chiamate jQuery $ .ajax() per restituire viste parziali basate su qualche azione dell'utente. Solitamente lo chiamo da una vista nello stesso controller che contiene la funzione che sto chiamando tramite Ajax. Ad esempio, una vista a mio controller Home ha la seguente funzione (che funziona bene):jQuery Ajax: URL del controller MVC di riferimento dalla radice dell'app

function loadMyPartialView() { 
    $.ajax({ 
     type: 'GET', 
     url: 'Home/GetNavigationTreePV/', 
     success: function (data) { onSuccess(data); }, 
     error: function (errorData) { onError(errorData); } 
    }); 
    return true; 
} 

Questo soprattutto url viene risolto al http://localhost/myappname/Home/GetNavigationTreePV e la vista parziale viene restituito correttamente.

Ora, sto cercando di utilizzare qUint per testare le mie funzioni. In questo test case, voglio solo verificare di arrivare alla fine della funzione e restituire true. Ho creato un controller QUNIT e una vista corrispondente (che carica il file JavaScript di test dell'unità). Dal file test.js che contiene i miei test di unità, provo a effettuare chiamate alle stesse funzioni presenti nelle visualizzazioni Home, come quella sopra. Ma, dal momento che sto esaurendo il controller QUNIT, l'URL viene risolto in http://localhost/myappname/qunit/Home/GetNavigationTreePV.

Ho provato a cambiare l'url della mia richiesta Ajax a /Home/GetNavigationTreePV/ (con la barra precedente precedente), ma quando lo faccio ottengo il seguente url http://localhost/myappname/Home/GetNavigationTreePV.

Quindi, per essere chiari, sto cercando di scrivere la mia richiesta Ajax in un modo che partirà sempre dalla radice della mia applicazione MVC, e quindi aggiungere il parametro url dato nella mia funzione $ .ajax().

C'è un modo semplice per farlo? Sto andando su questo in un modo strano?

risposta

10

sono stato in grado di realizzare questo con dritto JavaScript utilizzando window.location.pathname. Vedere il seguente esempio:

function loadMyPartialView() { 
    $.ajax({ 
     type: 'GET', 
     url: window.location.pathname + 'Home/GetNavigationTreePV/', 
     success: function (data) { onSuccess(data); }, 
     error: function (errorData) { onError(errorData); } 
    }); 
    return true; 
} 
+0

Questo è esattamente quello che stavo cercando. Stavo affrontando problemi quando distribuivo la mia app su IIS, in quel caso l'url menzionato nel file js non si risolveva correttamente. – binu

10

credo nella tua pagina MVC View è necessario @ Url.Action

function loadMyPartialView() { 
     $.ajax({ 
      type: 'GET', 
      url: '@Url.Action("GetNavigationTreePV", "Home")', 
      success: function (data) { onSuccess(data); }, 
      error: function (errorData) { onError(errorData); } 
     }); 
     return true; 
    } 

In alternativa è possibile utilizzare @ Url.Content

function loadMyPartialView() { 
     $.ajax({ 
      type: 'GET', 
      url: '@Url.Content("~/home/GetNavigationTreePV")', 
      success: function (data) { onSuccess(data); }, 
      error: function (errorData) { onError(errorData); } 
     }); 
     return true; 
    } 

Se questo è in un .js file, è possibile passare nell'URL come

loadMyPartialV iew ('@ Url.Action ("GetNavigationTreePV", "Home")')

+0

Nessuna fortuna. In questo caso, l'URL è stato risolto come: https: //localhost/ctsw/qunit/@Url.Action .... – MattW

+0

È necessario che questo sia nella pagina MVC View non in un file .js. – Steve

+0

Ahh ok. .. in questo caso, penso che potrebbe essere necessario farlo da un file .js per utilizzare il framework di test qUnit. Fammi vedere di poter scrivere test unitari nella vista. – MattW

Problemi correlati