2016-08-04 14 views
0

今日JSのJS部分からJSONを取得してC#メソッドに渡そうとしています。 現在のメソッドに結果を渡したときにnullになってしまう問題。ここでjsからMVCコントローラへのJSON

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

あなたがコードからわかるように、コンソールに私はマーカーの配列が空でない確認し、すべての新しいクリックした後、私は、配列に値を追加します。 私はそれを保存したいすべてのマーカーを見つけるので、私はそれのためのボタンを作った。それはどのように私のhtmlコードのように見える

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

:ここ

は私のデータモデルである
<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

nullは何ですか?いつ?あなたは 'ReturnJson()'の 'route'がヌルか空であると言っていますか?どこかの文字列か? 'JSON.stringify(マーカー)'は何を返しますか? –

+2

あなたはRouteCollectionにあるものを示してください。私は、Global.asax.csのRegisterRoutesメソッドを意味します。 – Antipod

+0

@EdPlunkettああ、メソッドReturnJsonでパラメータ "string" jsonがnullです。私がボタンを押すと(私はこれを理解しています)JSJの値をCシャープメソッドに渡すJSの関数TestJsonを呼び出しますか?私が間違っている? JSON.stringify(マーカー)は何を返しますか? 私はそれがjson形式でデータを返すと思います。 – whoiskatrin

答えて

1

あなたは、マーカーに追加されているアイテムは、プロパティlatlongtitleであるが、(あなたがするシリアライズしようとしている)あなたのビューモデルは、異なる性質を持っています名前。だから私はあなたが同じプロパティ名

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

、あなたはマーカーの配列を送信するために、あなたのパラメータとして、上記のクラスのコレクションを使用してクラスを作成することをお勧めします。パラメータとして文字列を使用する必要はなく、再度デシリアライズする必要はありません。 デフォルトのモデルバインダーは、私はちょうどあなたのrouteconfigに気づい

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

クラスオブジェクト秒のリストにポストされたデータをマッピングすることができるようになります。 2番目のルート登録は必要ありません。あなたのデフォルト経路登録は十分です。

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

関連する問題