【问题标题】:JSON from js to MVC controller从 js 到 MVC 控制器的 JSON
【发布时间】:2016-08-04 18:36:46
【问题描述】:

今天我试图从我的 JS 部分代码中获取 JSON 并将其传递给 c# 方法。 当我将结果传递给当前方法时,我得到 null 的问题。

这是我的 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();
    }

请帮忙找出为什么我得到一个空字符串。

更新。

这是我的路线配置

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

【问题讨论】:

  • 什么变量为空?什么时候?你是说ReturnJson() 中的route 是空的还是空的?或者某个地方的一些字符串? JSON.stringify(markers) 返回什么?
  • 请显示您在 RouteCollection 中的内容。我的意思是在 Global.asax.cs 中的 RegisterRoutes 方法中。
  • @EdPlunkett 哦,在 ReturnJson 方法中,参数“字符串”json 为空。当我按下一个按钮(据我所知)时,我应该在 JS 中调用函数 TestJson ,它将 json 值传递给 c sharp 方法。我错了吗? JSON.stringify(markers) 返回什么?我认为它以 json 格式返回数据。
  • @Antipod 哦,好的,我将其添加到问题中。请看一下。
  • ReturnJson 是您的 Home 控制器的成员吗?

标签: javascript c# jquery json asp.net-mvc


【解决方案1】:

您添加到标记的项目具有属性latlongtitle,但您的视图模型(您尝试序列化到的)具有不同的属性名称。所以我建议你创建一个具有相同属性名称的类

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

并且由于您想发送一个标记数组,因此请使用上述类的集合作为您的参数。您不需要使用字符串作为参数并再次对其进行反序列化。 默认模型绑定器将能够将发布的数据映射到MarkerItem 类对象的列表s

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

我刚刚注意到您的路由配置。您不需要第二条路线注册。你的默认路由注册就够用了。

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

【讨论】:

  • 这样做的方法。但是如果她想要一个字符串然后反序列化它怎么办。
  • @Antipod 其实我想问一下哪种方式更好:有一个字符串然后序列化它还是立即获取它来列出(它是内部自序列化的)?
  • 没有理由使用字符串和反序列化。 创建默认模型绑定器以将您发布的数据映射到您的方法参数(假设名称匹配)。读取为字符串和序列化似乎是重复的和不必要的,因为模型绑定器会为您这样做。
  • 当然,这是使用强类型类的正确方式,毫无疑问。或者你必须有一个不能使用它的强有力的理由。
  • 非常感谢,现在很清楚了。谢谢你们,伙计们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2014-04-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 2014-06-29
  • 2018-12-01
相关资源
最近更新 更多