2016-08-04 5 views
0

Сегодня я пытаюсь получить JSON из моей части кода JS и передать его методу C#. Проблема, которую я получил null, когда я передал результат текущему методу.JSON от js до контроллера MVC

Вот мой JS часть:

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" 
       }); 
       }; 

Как видно из кода, в консоли я вижу, что массив маркеров не является пустым, и после каждого нового нажмите добавить значения в массив. Когда я найду все маркеры, я хочу его сохранить, поэтому я сделал для этого кнопку.

Вот моя модель данных:

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>(); 
} 

Это, как выглядит мой HTML код:

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

И наконец-то, как выглядит, как метод, который должен получить JSON строку

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

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

Пожалуйста, помогите выяснить, почему я получаю пустую строку.

upd.

Вот мой маршрут конфигурация

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

Какая переменная равна нулю? Когда? Вы говорите, что 'route' в' ReturnJson() 'пуст или пуст? Или какая-то строка где-то? Что возвращает 'JSON.stringify (markers)? –

+2

Пожалуйста, покажите, что у вас есть в RouteCollection. Я имею в виду метод RegisterRoutes в файле Global.asax.cs. – Antipod

+0

@EdPlunkett oh, в методе ReturnJson параметр "string" json равен null. Когда я нажимаю кнопку (как я понимаю это), мне следует вызвать функцию TestJson в JS, которая передает значение json в острый метод. Я ошибаюсь? Что возвращает JSON.stringify (маркеры)? Как я думаю, он возвращает данные в формате json. – whoiskatrin

ответ

1

Элементы, которые вы добавляете к маркерам со свойствами lat, long и title, но моделью вида (который вы пытаетесь сериализации в) имеют разные свойства имена. Поэтому я предлагаю вам создать класс с одинаковыми именами свойств

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

и так как вы хотите, чтобы отправить массив маркера, используйте коллекцию указанного класса в качестве параметра. Вам не нужно использовать строку в качестве параметра и снова десериализовать ее. Модель Связующее по умолчанию будет иметь возможность сопоставить отправленные данные в список объекта класса ов

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

Я просто заметил ваш 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 } 
    ); 
    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 
} 
+0

Это способ сделать это. Но что, если она хочет иметь строку, а затем десериализует ее. – Antipod

+0

@Antipod На самом деле, я хочу спросить, какой путь лучше: иметь строку, а затем сериализовать ее или сразу же ее перечислить (она самосериализована внутри)? – whoiskatrin

+1

Нет причин использовать строку и десериализовать. ** Создано стандартное связующее устройство для сопоставления ваших опубликованных данных с параметрами метода (при совпадении имен) **. чтение в виде строки и сериализации кажется дублирующим и ненужным, поскольку для этого используется связующее устройство. – Shyju

Смежные вопросы