Результат геокодирования Google в контроллере MVC - PullRequest
1 голос
/ 11 мая 2011

Я использую JavaScript API v3. Я в основном геокодировать адрес следующим образом:

geocoder.geocode({ 'address': address }, function (results, status) {
    //Get results array here
}

Это успешно работает. Теперь мне нужно передать этот JSON контроллеру MVC. Я видел множество способов сделать это, но я не могу заставить его работать с результатом Geocode.

From Haack : (У меня есть коллекция объектов, которая дублирует структуру результата. Самый внешний объект - result[] (см. Ниже)).

geocoder.geocode({ 'address': address }, function (results, status) {
    var jsonT = JSON.stringify(results);           
    $.ajax({
        url: '/Ctrl/Action',
        type: "POST",
        dataType: 'json',
        data: jsonT,
        contentType: "application/json; charset=utf-8",
        success: function (result) {
            alert(result.Result);
        }
    });
}

Метод контроллера срабатывает, однако значение всегда null.

    [HttpPost]
    public ActionResult Action(GoogleGeoCodeResponse geoResponse)
    {
        //geoResponse is always null
        return View();
    }

Мои классы Google

[Serializable]
public class GoogleGeoCodeResponse
{
    //public string status { get; set; }
    public results[] results { get; set; }

}
[Serializable]
public class results
{
    public string[] types { get; set; }
    public string formatted_address { get; set; }
    public address_component[] address_components { get; set; }
    public geometry geometry { get; set; }
    public string partial_match { get; set; }
}
[Serializable]
public class address_component
{
    public string[] types { get; set; }
    public string long_name { get; set; }
    public string short_name { get; set; }
}
[Serializable]
public class geometry
{
    public location location { get; set; }
    public string location_type { get; set; }
    public viewport viewport { get; set; }
    public bounds bounds { get; set; }
}
[Serializable]
public class location
{
    public string lat { get; set; }
    public string lng { get; set; }
}
[Serializable]
public class viewport
{
    public southwest southwest { get; set; }
    public northeast northeast { get; set; }
}
[Serializable]
public class bounds
{
    public southwest southwest { get; set; }
    public northeast northeast { get; set; }
}
[Serializable]
public class southwest
{
    public string lat { get; set; }
    public string lng { get; set; }
}
[Serializable]
public class northeast
{
    public string lat { get; set; }
    public string lng { get; set; }
}

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Если вы добавили фабрику провайдера значений JSON в Application_Start:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

, а фактический JSON-запрос соответствует вашей сигнатуре модели представления:

{ geoResponse: { 
    results: [ 
        { types: [ 't1', 't2' ], formatted_address: 'abc', ... }, 
        { types: [ 't3', 't4' ], formatted_address: 'def', ... }, 
        ...
    ] } 
}

, вы должны успешно получитьмодель представления в действии контроллера.Кроме того, вам, вероятно, не нужно украшать свои модели [Serializable], поскольку они не используются сериализаторами XML и JSON.Используется для двоичной сериализации.

0 голосов
/ 11 мая 2011

Вырвав себе волосы, я сделал перерыв и вернулся, чтобы сразу же найти проблему с помощью @Darin Dimitrov.Проблема заключалась в том, что JSON не соответствовал объекту.Объект GoogleGeoCodeResponse имеет массив results, называемый результатами, однако JSON, возвращенный из Google, имеет массив результатов, но он не назван.Добавление этого до того, как мой stringify добавляет правильные структуры именования и все хорошо связывается.

var o = { results: results };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...