2014-12-15 2 views
1

Я пытаюсь выставить API, который позволит пользователям публиковать полигоны для сохранения на сервере. Я использую ASP.NET MVC 5. Как правильно отформатировать параметры AJAX, чтобы отправить запрос на DbGeography? Это то, что я пытаюсь:Как опубликовать параметр DbGeography для MVC?

$.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, но MyGEOG есть null если AJAX сообщение бывает. Каков правильный формат параметра для правильной публикации в качестве типа DbGeography?

+0

Чтобы уточнить, как вы собираетесь хранить данные со стороны API, можете ли вы указать определение класса newShape, пожалуйста? –

+0

Я обновил его, THX! – TruMan1

+0

Мне нужна была география для возвышения. – TruMan1

ответ

3

Причина, по которой объект DBGeography является неизменным, что означает, что вы не можете писать ему после его создания. Когда вы создаете экземпляр класса MapShape в привязке модели, свойство MyGEO равно null. Другими словами, вы пытаетесь установить свойство на нулевом объекте.

Единственный способ «создать» объект DBGeography использует один из фабричных методов, таких как:

FromText - Создает новое значение DbGeometry на основе указанного хорошо известным значением текста. http://msdn.microsoft.com/en-us/library/hh673669(v=vs.110).aspx

Таким образом, чтобы пройти в Название и WellKnownText значения вы контроллер, я предлагаю создать Transfer Data Object (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) 
      }; 
     ... 
    } 
+0

Это решение приемлемо только для работы. Почему нет более элегантного способа (используя ModelBinder или тому подобного) для решения этой проблемы? Люди ищут помощь в решении этой проблемы во всем Интернете. – Believe2014

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