Парсинг JSON в DropDownList ASP.NET

315
14 февраля 2017, 17:01

Привет есть код. Контролер

public class HomeController : Controller
{
    public ActionResult Index()
    {
        using (StreamReader reader = new StreamReader("db.json"))
        {
            string json = reader.ReadToEnd();
            var items = JsonConvert.DeserializeObject<List<SelectListItem>>(json);
            ViewBag.List = items;
        }
        return View();
    }
}

Вьюшка

@{
    ViewBag.Title = "Лаба";
    var listItems = new List<SelectListItem>();
    foreach (var c in ViewBag.List)
    {
        listItems.Add(new SelectListItem { Text = c.Id, Value = c.Name });
    }
}
<div class="row">
    <div class="col-md-4">
        @Html.DropDownList("Name", listItems)
    </div>
</div>

Так вот вылетает эксепш

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ""System.Web.Mvc.SelectListItem" не содержит определения для "Id""

показывает что ViewBag не пустой имеет 3 значения вот JSON

[
  {
    "Id": 0,
    "Name": "Саша"
  },
  {
    "Id": 1,
    "Name": "Даша"
  },
  {
    "Id": 2,
    "Name": "Маша"
  }
]

что я не так делаю?

Answer 1

Проблема у Вас в том что Вы пытаетесь свою структуру (Id, Name) привести к SelectListItem, что конечно же не есть хорошо в Вашем случае. И соответсвенно Вы получаете RuntimeBinderException потому что Вы попытались десеариализовать Вашу структуру к SelectListItem который не содержить свойства/поля Id и Name.

Хот фикс вот:

var items = JsonConvert.DeserializeObject<List<dynamic>>(json);
ViewBag.List = items;
return View();

А по хорошему создайте класс, который може представлять Вашу структуру, например:

public class Entity // тут какое-то смысловое имя структуры.
{
  public int Id { get; set; }
  public string Name { get; set; }
}

и код в контролере будет таким:

var items = JsonConvert.DeserializeObject<List<Entity>>(json);
ViewBag.List = items;
return View();
READ ALSO
Команда using()

Команда using()

Правильно ли я понял, что данная конструкция создает область видимости(работы) переменной variableИ после закрытия скобки вызывает Dispose() переменной?

273
Заполнение базы данных CodeFirst EF

Заполнение базы данных CodeFirst EF

При создании базы использую для авторизации IdentityВ файле по умолчанию IdentityModels

306
datalist Аналог в ASP.NET

datalist Аналог в ASP.NET

привет есть код

308
Сортировка по отзывам из двух таблиц

Сортировка по отзывам из двух таблиц

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

385