2016-08-04 10 views
0

heute versuche ich, JSON von meinem JS-Teil des Codes zu bekommen und es an C# Methode übergeben. Das Problem, dass ich null bekam, wenn ich das Ergebnis an die aktuelle Methode übergeben habe.JSON von js zu MVC-Controller

Hier ist mein JS Teil:

GMaps.on('click', 
        map.map, 
        function(event) { 

         markers.push(new Point(map.markers.length, event.latLng.lat(), event.latLng.lng())); 


         var index = map.markers.length; 
         var lat = event.latLng.lat(); 
         var lng = event.latLng.lng(); 
         map.addMarker({ 
          lat: lat, 
          lng: lng, 
          title: 'Marker #' + index 
         }); 
         console.log(JSON.stringify(markers)); 
        }); 

       function TestJSON() { 

        $.ajax({ 
         url: "@Url.Action("ReturnJson","Home")", 
         type: "POST", 
         data: JSON.stringify(markers), 
         contentType: "application/json; charset=utf-8", 
         dataType: "json" 
       }); 
       }; 

Wie Sie aus dem Code zu sehen, die in der Konsole sehe ich, dass Array von Markern nicht leer ist und nach jedem neuen klicken ich einen Wert in das Array hinzuzufügen. Wenn ich alle Markierungen finden will, die ich speichern möchte, habe ich einen Knopf dafür gemacht.

Hier ist meine Datenmodell:

public class TripPoint 

{ 
    public string Name { get; set; } 
    public double Latitude { get; set; } 
    public double Longitude { get; set; } 

} 

public class TripRoute 
{ 
    public List<TripPoint> route = new List<TripPoint>(); 
} 

Es wie wie mein HTML-Code aussieht:

<form> 
      <button type="button" value="Save your route " onclick="TestJSON()"></button> 
     </form> 

Und endlich es, wie sieht aus wie die Methode, die JSON-String

[HttpPost] 
    public ActionResult ReturnJson(string json) 
    { 
     // ********************************** 
     // PROBLEM HERE: json is null 
     // ********************************** 

     TripRoute route = new JavaScriptSerializer().Deserialize<TripRoute>(json); 
     return new EmptyResult(); 
    } 
bekommen sollte

Bitte helfen Sie herauszufinden, warum ich eine Null-Zeichenfolge bekomme.

upd.

Hier ist meine Route Config

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

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

     ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 
    } 
} 
+1

Welche Variable ist null? Wann? Willst du sagen, dass 'route' in' ReturnJson() 'null oder leer ist? Oder irgendwo eine Schnur? Was gibt 'JSON.stringify (markers)' zurück? –

+2

Bitte zeigen Sie, was Sie in der RouteCollection haben. Ich meine in RegisterRoutes-Methode in der Global.asax.cs. – Antipod

+0

@EdPlunkett oh, in der Methode ReturnJson ein Parameter "Zeichenfolge" json ist null. Wenn ich einen Knopf drücke (wie ich das verstehe), sollte ich die Funktion TestJson in JS aufrufen, die den JSON-Wert an die cis-Methode übergibt. Liege ich falsch? Was gibt JSON.stringify (Markierungen) zurück? Wie ich denke, gibt es Daten im JSON-Format. – whoiskatrin

Antwort

1

Die Elemente, die Sie auf die Markierungen hinzufügen, mit Eigenschaften ist lat, long und title, aber Ihre Ansicht Modell (die Sie zu serialisiert versuchen zu) hat verschiedene Namen. Also schlage ich vor, Ihnen eine Klasse mit demselben Eigenschaftsnamen

public class MarkerItem 
{ 
    public string Title {set;get;} 
    public decimal Lat {set;get;} 
    public string Long { set;get;} 
} 

und zu schaffen, da Sie eine Reihe von Marker senden mögen, eine Sammlung der oben genannten Klasse als Parameter verwenden. Sie müssen keine Zeichenfolge als Parameter verwenden und sie erneut deserialisieren. Das Standardmodell Bindemittel werden die gesendeten Daten auf eine Liste von Klassenobjekt s

public ActionResult ReturnJson(List<MarkerItem> markerItems) 
{ 
    //do something with markerItems list 
    // to do : Return something 
} 

Ich habe gerade bemerkt Ihre routeconfig abzubilden können. Sie brauchen die zweite Routenregistrierung nicht. Ihre Standardroutenregistrierung ist gut genug.

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 
} 
+0

Dies ist der Weg, es zu tun. Aber was, wenn sie eine Zeichenkette haben möchte und sie dann deserialisieren will. – Antipod

+0

@Antipod Eigentlich möchte ich fragen, welcher Weg besser ist: eine Zeichenkette zu haben und sie dann zu serialisieren oder sie sofort zu listen (ist es innen selbst serialisiert)? – whoiskatrin

+1

Es gibt keinen Grund, einen String und Deserialize zu verwenden. ** Der Standardmodellbinder wird erstellt, um Ihre gebuchten Daten Ihren Methodenparametern zuzuordnen (vorausgesetzt, die Namen stimmen überein) **. Lesen als String und Serialisierung scheint doppelt und unnötig, wie Modellbinder das für Sie tut. – Shyju