Как вернуть несколько данных ViewBag для просмотра с контроллера? - PullRequest
0 голосов
/ 11 декабря 2018

Я использую API погоды, в котором пользователь ищет погоду для определенного города или страны из вида, который получает контроллер в качестве параметра, информация о погоде полностью работает, но я просто не могу вернуть всю эту информацию обратно для просмотра из контроллера.

просмотр для поиска

<form action="searchbyname" method="post">
    <input type="text" name="weather" placeholder="Find your location...">
    <input type="submit" value="Find">               
</form>

Контроллер

 public ActionResult searchbyname(string weather)
        {
            string appId = "f40a39abac667183c127adefffcf88ed";
            string url = string.Format("http://api.openweathermap.org/data/2.5/weather?q={0}&units=metric&APPID={1}", weather, appId);
            using (WebClient client = new WebClient())
            {
                string json = client.DownloadString(url);
                if (json.IndexOf("Error") == -1)
                {

                    WeatherInfo weatherInfo = (new JavaScriptSerializer()).Deserialize<WeatherInfo>(json);
                    ViewBag.citycountry = weatherInfo.name + "," + weatherInfo.sys.country;
                    ViewBag.ImageUrl = string.Format("http://openweathermap.org/images/flags/{0}.png", weatherInfo.sys.country.ToLower());
                    ViewBag.des = weatherInfo.weather[0].description;
                    //weatherimage
                    ViewBag.ImageUrl = string.Format("http://openweathermap.org/img/w/{0}.png", weatherInfo.weather[0].icon);
                    ViewBag.temp = string.Format("{0}°С", Math.Round(weatherInfo.main.temp, 1));

                }
            }
            return View();
        }

Просмотр данных, которые должны отображаться

<table id="tblWeather" border="0" cellpadding="0" cellspacing="0" style="display:none">
<tr>
    <th colspan="2">
        Weather Information
    </th>
</tr>
<tr>
    <td rowspan="3">
        <img id="imgWeatherIcon" />
    </td>
</tr>
<tr>
    <td>
        <span id="citycountry">@ViewBag.citycountry</span>
        <img id="imageurl" src="@ViewBag.ImageUrl" />
        <span id="des">@ViewBag.des</span>
    </td>
</tr>

Модель класса

public class ClimateModel
    {
        public class WeatherInfo
        {
            public Coord coord { get; set; }
            public Sys sys { get; set; }
            public List<Weather> weather { get; set; }
            public Main main { get; set; }
            public int dt { get; set; }
            public string name { get; set; }
        }

        public class Coord
        {
            public double lon { get; set; }
            public double lat { get; set; }
        }

        public class Sys
        {
            public string country { get; set; }
        }

        public class Weather
        {
            public string main { get; set; }
            public string description { get; set; }
            public string icon { get; set; }
        }

        public class Main
        {
            public double temp { get; set; }
            public double temp_min { get; set; }
            public double temp_max { get; set; }
            public int humidity { get; set; }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Как указал Эрик в своем комментарии, вы можете использовать модель для захвата ответа API, а затем поместить его либо в пакет просмотра, либо в данные просмотра, чтобы иметь возможность доступа к нему внутри представления.

ViewBag.WeatherInfo = weatherInfo;

Тогда внутри вашего взгляда вы можете сделать:

var weatherInfo = ViewBag.WeatherInfo as WeatherInfo

Таким образом, у вас есть доступ к вашему объекту внутри представления

Как здесь указано, как его можно использовать в вашей ситуации

@{
var weatherInfo = ViewBag.WeatherInfo as WeatherInfo 
}

<table id="tblWeather" border="0" cellpadding="0" cellspacing="0" style="display:none">
<tr>
    <th colspan="2">
        Weather Information
    </th>
</tr>
<tr>
    <td rowspan="3">
        <img id="imgWeatherIcon" />
    </td>
</tr>
<tr>
    <td>
        <span id="citycountry">@weatherInfo.name , @weatherInfo.sys.country</span>
        <img id="imageurl" src="your image link" />
        <span id="des">@weatherInfo.weather.First().description</span>
    </td>
</tr>
0 голосов
/ 11 декабря 2018

Я думаю, что вы смешиваете некоторые понятия между WebForms и MVC.На MVC нет runat="server", asp:Label или asp:Image.Вы должны использовать с чистыми элементами HTML.

Ваш код должен выглядеть примерно так:

<table id="tblWeather" border="0" cellpadding="0" cellspacing="0" style="display:none">
    <tr>
        <th colspan="2">
            Weather Information
        </th>
    </tr>
    <tr>
        <td rowspan="3">
            <img id="imgWeatherIcon" />
        </td>
    </tr>
    <tr>
        <td>
            <span id="citycountry">@ViewBag.citycountry</span>
            <img id="imageurl" src="@ViewBag.ImageUrl" />
            <span id="des">@ViewBag.des</span>
        </td>
    </tr>
</table>

РЕДАКТИРОВАТЬ 1: Как указывал @ erik-philips, вы должны действительно создатькласс модели.

РЕДАКТИРОВАТЬ 2: Взгляните на HTML Helpers .Это может сделать вашу жизнь проще, если привязать модели к представлениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...