2015-02-09 17 views
6

Ho una direttiva di base in una pagina di layout MVC 5 con una direttiva per la ricerca. Il mio problema è che il templateUrl non può essere caricato (400 errore). Se inserisco l'URL direttamente nel browser, posso caricare la pagina html senza difficoltà o errore. Non riesco a scoprire perché la chiamata AJAX per caricare la pagina stia fallendo.AngularJS Directive templateUrl restituisce 400 sebbene carichi URL del file

Chrome Debugger Chrome debugger

Questo è il caricamento pagina HTML in Chrome

Page loads

app.js

(function() { 
    var app = angular.module("mainApp"); 

    app.directive("basicSearch", function() { 
     return { 
      templateUrl: 'app/directives/basic-search.html', 
      controller: function($scope, search) { 
       $scope.keyword = ''; 
       $scope.exact = false; 
       $scope.submitSearch = function() { 
        search.searchByKeyword($scope.keyword, 0, $scope.exact); 
       } 
      } 
     } 
    }); 
}()); 

base-search.html

<div> 
    <input type="search" ng-model="keyword" name="keyword" /> 
    <button type="submit" ng-click="submitSearch()"></button> 
    <input type="checkbox"ng-model="exact" name="exact" /> 
    <label for="exact">Exact Match?</label> 
</div> 

_Layout.cshtml

<html> 
    <head> 
    <base href="@Request.ApplicationPath" /> 
    <!--- JS & CS References --> 
    <title></title> 
    </head> 
    <body ng-app="mainApp"> 
    <!-- Other stuff --> 
    <basic-search></basic-search> 
    <!-- More other stuff --> 
    @RenderBody() 
    </body> 
</html> 

EDIT Ecco la richiesta di successo (via browser): Good Request

e qui è quello che fallisce (tramite direttiva Angular): Bad Request

+0

Confronta le intestazioni in entrambi i casi, forse c'è una differenza. – dfsq

+0

Il modello si trova in una cartella statica per essere servito? Se non riesci ad accedere al modello semplice tramite l'url nel tuo browser non puoi farlo anche io .... –

+0

Posso accedervi. Vedi la sezione ** Carichi URL **. –

risposta

3

Ho risolto. Sembra che qualcuno ha aggiunto quanto segue alla configurazione del modulo come un tentativo di risolvere un bug di IE (sorpresa, sorpresa):

//initialize get if not there 
if (!$httpProvider.defaults.headers.get) { 
    $httpProvider.defaults.headers.get = {}; 
} 

//disable IE ajax request caching 
$httpProvider.defaults.headers.get["If-Modified-Since"] = "0"; 

ho rimosso, cancellato il mio cache e che sta funzionando bene.

3

Il bug di IE a cui Chris fa riferimento è un errore di memorizzazione nella cache che consente di riutilizzare i vecchi contenuti quando si utilizzano $ http e IE di angular.

ho scritto su questo argomento qui: http://benjii.me/2014/07/ie-is-caching-my-angular-requests-to-asp-net-mvc/

una correzione migliore di rimuovere il codice di bug-fix è quello di risolvere il problema. Utilizza invece:

//initialize get if not there 
if (!$httpProvider.defaults.headers.get) { 
    $httpProvider.defaults.headers.get = {}; 
} 

//disable IE ajax request caching 
$httpProvider.defaults.headers.get["If-Modified-Since"] = "Fri, 01 Jan 2010 00:00:00 GMT"; 
Problemi correlati