2016-02-09 2 views
1

Я создал файл .json, который содержит туристические места города. Мой файл JSON выглядеть this-получить все данные объекта json в представлении, используя ASP.NET MVC и JSON.Net

{ 
"city":[ 
{ 
"Name": "Flensburg Firth", 
"Shorttext": "Flensburg Firth or Flensborg Fjord ....", 
"Longitude": 9.42901993, 
"Latitude": 54.7959404, 
"Image": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Flensborg_Fjord_ved_bockholmwik.jpg/400px-Flensborg_Fjord_ved_bockholmwik.jpg" 
}, 


{ 
"Name": "Naval Academy Mürwik", 
    "Shorttext": "The Naval Academy Mürwik is the main train....", 
"Longitude": 9.45944444, 
"Latitude": 54.815, 
"Image": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/MSM-hauptgebaeude.jpg/400px-MSM-hauptgebaeude.jpg" 

}, 
{ 
"Name": "Nordertor", 
"Shorttext": "The Nordertor is an old town gate in Flensburg, Germany....", 
"Longitude": 9.43004861, 
"Latitude": 54.79541778, 
    "Images":"https://upload.wikimedia.org/wikipedia/commons/thumb/6/6b/Nordertor_im_Schnee_%28Flensburg%2C_Januar_2014%29.JPG/266px-Nordertor_im_Schnee_%28Flensburg%2C_Januar_2014%29.JPG" 

} 

] 

}

Мой класс модели, чтобы получить объект для этого JSon данных -

public class City 
{ 
    public string Name { get; set; } 
    public string Shorttext { get; set; } 
    public double Longitude { get; set; } 
    public double Latitude { get; set; } 
    public string Image { get; set; } 

} 
public class RootObject 
{ 

    public List<City> city { get; set; } 
} 

Теперь в контроллере я создаю ActionResult вернуться вид с точки зрения сумка Сообщение- // Я редактировал contrller класс

public ActionResult GMap(City objCityModel) 
    { 

     string name = objCityModel.Name; 
     ViewBag.Title = name; 


     var ReadJson = System.IO.File.ReadAllText(Server.MapPath(@"~/App_Data/"+name+".json")); 

     RootObject json = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<RootObject>(ReadJson); 



     foreach (var item in json.poi) 
     { 

      ViewBag.Name = item.Name; 
      ViewBag.ShortText = item.Shorttext; 
      ViewBag.Latitude = item.Latitude; 
      ViewBag.Longitude = item.Longitude; 
      ViewBag.Image = item.Image; 
     } 

    return View(); 

Мои GMap.cshtml это -

@model Test2_search.Models.City 


@{ 
ViewBag.Title1 = "Google Map View"; 
} 

<h2>@ViewBag.Title</h2> 
<p>@ViewBag.ShortText</p> 
<p>@ViewBag.Latitude</p> 
<p>@ViewBag.Longitude</p> 
<p>@ViewBag.Image</p> 

С помощью этого кода я могу получить только первый объект этого JSon файла. как только данные для «Фленсбург Ферт». но я хочу показать все три места в этом городе. Как я могу получить все десериализованные данные json в этом случае.

ответ

0
Lit<City> mycities=new List<City>(); 
    foreach (var item in json.poi) 
    { 
     City obj=new City(){ 
     Name = item.Name, 
     ShortText = item.Shorttext, 
     Latitude = item.Latitude, 
     Longitude = item.Longitude, 
     Image = item.Image, 
     }; 
     mycities.Add(obj); 
    } 

// Вы можете даже иметь это в ViewModel

 ViewBag.Cities=mycities; 

А на ваш взгляд @Foreach (вар город viewBag.Города) {// Bind уры данные }

Надеются, что это шаги могут помочь

+0

Большое спасибо. Ты спасаешь мой день. Многие много спасибо –

+0

, вы делаете двойную работу здесь. Вы уже определили город как список . Нет смысла копировать его в новый объект. Просто верните json.poi. вот так ViewBag.Cities = json.poi; – Fran

+0

ViewBag.Cities = json.poi.city; Я думаю, что это было бы более точно с минимальными строками кода. – Nagaraj

0

Прежде всего: .First() всегда возвращает только один элемент или исключение.

Чтобы получить все имена Вы можете:

  • Показать города в списке/таблице прохождение для просмотра модели в RootObject и виде петле через каждый пункт в RootObject.city

  • Регистрации всех имен с использованием string.Join методы и передать их View с ViewBag, как вы это делали.

Пример String.Join(", ",json.city.Select(c => c.Name); => Вывод: London, New York, Paris


О "всегда получает последний элемент": этот код будет возвращать только последний элемент.

foreach (var item in json.poi) 
    { 

     ViewBag.Name = item.Name; 
     ViewBag.ShortText = item.Shorttext; 
     ViewBag.Latitude = item.Latitude; 
     ViewBag.Longitude = item.Longitude; 
     ViewBag.Image = item.Image; 
    } 

Причина в первой итерации ваш ViewBag.Name будет содержать имя элемента. На второй итерации вы переопределяете значение ViewBag.Name для имени элемента secon. Таким образом, в конце концов, вы получите последнее имя элемента

+0

Я редактировал мой класс контроллера. но теперь я получаю последний. Не могли бы вы объяснить, как я могу получить все три значения. Я действительно много борюсь за эту проблему в течение двух дней. спасибо –

+0

Но я не получаю никакого способа показать весь результат соответственно. Я просмотрел 100 раз весь сайт. но для этого нет идеального решения. –

0

Изменить вид на этот

@model Test2_search.Models.City 


    @{ 
    ViewBag.Title1 = "Google Map View"; 
    } 

      @foreach (var item in Model) 
      { 
    <h2>@item.Title</h2> 
    <p>@item.ShortText</p> 
    <p>@item.Latitude</p> 
    <p>@item.Longitude</p> 
    <p>@item.Image</p> 
} 

Изменить действие контроллера для этого

public ActionResult GMap() 
    { 

     var ReadJson = System.IO.File.ReadAllText(Server.MapPath(@"~/App_Data/whateverthenameis.json")); 

     RootObject json = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<RootObject>(ReadJson); 

    return View(json.city); 
} 

Я не уверен, где json.poi вошел в играть. Я не вижу, чтобы вы определили его в своей модели.