【问题标题】:How to post DbGeography param to MVC?如何将 DbGeography 参数发布到 MVC?
【发布时间】:2015-02-13 01:48:30
【问题描述】:

我正在尝试公开一个 API,该 API 将允许用户发布多边形以在服务器上持续存在。我正在使用 ASP.NET MVC 5。如何正确格式化 AJAX 参数以发布 DbGeography 请求?这就是我正在尝试的:

$.ajax({
    url: '/api/map',
    type: 'POST',
    data: {
        Title: 'My Title',
        MyGEOG: {
            WellKnownText: 'POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))'
        }
    }
});

这就是我的 MVC 动作签名的样子:

    [HttpPost]
    [Route("map")]
    public JsonResult Post(MyShape newShape) {...}

也是我的MyShape类:

public class MapShape
{
    public string Title { get; set; }
    public System.Data.Entity.Spatial.DbGeography MyGEOG { get; set; }
}

在操作中设置断点时,newShape.Title 确实显示为 My Title,但在 AJAX 发布发生时MyGEOG 为空。正确发布为DbGeography 类型的参数的正确格式是什么?

【问题讨论】:

  • 为了进一步阐明您打算如何在 API 端存储数据,能否请您包含您的 newShape 类定义?
  • 我需要地理来获得海拔。

标签: javascript ajax asp.net-mvc entity-framework geospatial


【解决方案1】:

DBGeography 对象是不可变的,这意味着一旦它被创建就不能写入它。在模型绑定器中实例化 MapShape 类时,MyGEO 属性为空。换句话说,你试图在一个空对象上设置一个属性。

“创建” DBGeography 对象的唯一方法是使用以下工厂方法之一:

FromText - 根据指定的已知文本值创建一个新的 DbGeometry 值。 http://msdn.microsoft.com/en-us/library/hh673669(v=vs.110).aspx

因此,要将 TitleWellKnownText 值传递给您的控制器,我建议创建一个数据传输对象 (DTO) 来执行作为信息的代理。

public class MapShapeDTO
{
    public string Title { get; set; } 
    public string WellKnownText { get; set; }
}

你的 Ajax 就这样被简化了

$.ajax({
url: '/api/map',
type: 'POST',
data: {
    Title: 'My Title',
    WellKnownText: 'POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))'
    }
});

你的控制器,你可以使用 DTO 来创建 MapShape 对象。

[HttpPost]
[Route("map")]
public JsonResult Post(MapShapeDTO dto)
    {
        MapShape m = new MapShape()
            {
                Title = dto.Title,
                MyGEOG = System.Data.Entity.Spatial.DbGeography.FromText(dto.WellKnownText)
            };
      ...
    }

【讨论】:

  • 此解决方案仅作为一种解决方法可接受。为什么没有更优雅的方式(使用 ModelBinder 等)来解决这类问题?人们正在网络上为这个问题寻求帮助。
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2016-11-10
  • 2012-08-26
  • 2018-07-12
相关资源
最近更新 更多