Nach der Installation von ASP.NET MVC4 Beta im Visual Studio 2010 gibt es ein neues Projekt-Template – eine Single Page Application. In Verbindung mit Upshot, Knockout sowie natürlich jQuery usw. können hier interessante Anwendungen erstellt werden. Als Entwickler muss man natürlich dem Drang nachgeben und sich hier versuchen. Und da es in vorgefertigten Tutorials immer leichter geht als in einem echten Projekt bin ich auf so manche Hürden gestoßen.
1) Ganz wichtig ist, dass man trotz aktueller MVC Installation das Single Page Application Template (z.B.: per nuget) erneut installiert, um hier die aktuellste Version zu erhalten!
Mein Projekt wurde anschließend aktualisiert. Eine Fehlermeldung vom Visual Studio hat womöglich verhindert, dass das gesamte Projekt korrekt auf die neuesten Elemente aktualisiert wurden. Dies viel jedoch nicht gleich auf.
Erst als ich neben dem Auslesen auch ein Element einfügen wollte kam ständig eine Fehlermeldung:
405 Method Not Allowed bei api/Controller?action=/Submit
Durch das Einfügen von knockout.debug.js (anstatt der knockout-2.0.0.js) und clientseitigem Javascript-Debug kam ich auf eine weitere, etwas mehr detailiertere Fehlermeldung: “The requested resource does not support http method 'POST'”
Leider hat auch dies nicht so ganz wirklich gut weiter geholfen, denn die bisher gefundenen Lösungsvorschläge waren:
- Überprüfe, ob die Insert-Methode im Controller auch Insert[NameDerEntityKlasse] heißt
- Gib ein Insert-Attribut über die gewünschte Methode
Beides mehrfach überprüft und hat nichts geholfen.
Schlussendlich hat mir ein Blogpost geholfen bzw. die darin vorgeschlagene Lösung (http://forums.asp.net/t/1785874.aspx/1)
In der Globa.asax.cs gilt es die Http-Route zu ändern, damit diese nicht auf den Id-Parameter im Querystring, sondern auf den Action-Parameter hört. Dies war die Lösung dieses Problems – zumindest für mich
Ich hoffe, dass diese Lösung noch weiteren Entwicklern hilft und die Stunden der Suche verringert.
Also von:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
nach:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { action = RouteParameter.Optional }
);