7 messaggi dal 07 febbraio 2013
Salve a tutti,
non capisco perchè quando parte la mia applicazione viene eseguita la action Prodotti che grazie alla relativa View mi fa' vedere correttamente l'elenco dei prodotti tramite AJAX. Infatti, da debug su Network vedo correttamente la chiamata api/products senza alcun errore.
Se invece, dal menu' mi posiziono sulla Home/Prodotti, la stessa action Prodotti a cui è legata la View precedente mi genera un errore 404? Infatti tramite debug vedo che api/products non può essere trovata perchè sotto Home. in pratica l'AJAX per leggere i dati cerca l'URL Home/api/products invece di solo api/products ??
qualcuno mi può aiutare?
grazie.




ProductController.cs (Web API):

public class ProductsController : ApiController
{
static readonly IProductRepository repository = new ProductRepository();

public IEnumerable GetAllProducts()
{
return repository.GetAll();
}

.........



RouteConfig.cs:

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Prodotti", id = UrlParameter.Optional }


WebApiConfig.cs:

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { controller = "Product", action = "GetAllProducts", id = RouteParameter.Optional }
);


Action nel Controller HomeController:

public ActionResult Prodotti()
{
return View();
}



AJAX nella view prodotti.cshtml:


<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
<script>
var uri = 'api/products';

$(document).ready(function () {
// Send an AJAX request
$.getJSON(uri)
.done(function (data) {
// On success, 'data' contains a list of products.
$.each(data, function (key, item) {
// Add a list item for the product.
$('<li>', { text: formatItem(item) }).appendTo($('#products'));
});
});
});

function formatItem(item) {
return 'Id:'+item.Id+' name:'+ item.Name + ' categoria:'+ item.Category + ': ¤' + item.Price;
}
</script>
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
il problema dipende dal fatto che hai indicato un percorso relativo.
var uri = 'api/products';

Il browser accoderà il frammento "api/products" al percorso corrente, che che è /Home. Il percorso richiesto diventerà quindi /Home/api/products.

Questo è ovviamente sbagliato perché tu vuoi che la richiesta venga inviata a /api/products, indipendentemente da quale sia il percorso della pagina che l'utente sta visualizzando. In questo caso ti basta indicare un percorso assoluto anteponendo lo slash. Vai così:
var uri = '/api/products';


ciao,
Moreno

Enjoy learning and just keep making
7 messaggi dal 07 febbraio 2013
Ciao Moreno,
chissa' perche' avevo pensato pure io di fare una cosa del genere ma mi sembrava troppo banale. Quindi siccome la mia sara' un applicazione MVC+webapi sostituisco tutti gli uri del mio codice Angular che si occupa della gestione delle View anteponendo lo '/' alla mia routing...

ho provato e funziona!!!
Infatti la cosa strana che ho notato è che se nella route MVC di default invece di mettere la action Index (che è la mia default) mettevo la action Products, all'avvio andava tutto bene ma non appena mi spostavo sulle altre pagine del menu' e tornavo sulla home/prodotti, mi trovavo il casino...

grazie 1000 ancora!!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.