EF Core .ToList () Запрос, возвращающий «{Namespace.Models.Model}» вместо данных - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть модель с именем Situation, и я просто получаю их все, чтобы я могла перечислить их в выпадающем списке в представлении.Вот мой запрос:

var situations = _context.Situations.ToList();

Раскрывающийся список:

@Html.DropDownList("SituationID", null, "Pick One: ", new { @class = "form-control" })

Странная часть состоит в том, что каждый из элементов в возвращаемом наборе является моим Namespace.Models.Situation вместо значений в верхней частиуровень.

Мой другой запрос о возврате пользователей (public class ApplicationUser : IdentityUser) возвращает их адреса электронной почты для [0], 1 ..., а затем свойства под ними.Вот скриншоты в точке останова:

enter image description here

enter image description here

enter image description here

Помимо того, что я до сих пор очень мало понимаю о том, как использовать @ Html.DropDownList HtmlHelper (подробнее об этом в других вопросах), я не могу понять, что между ними различается.Ясно, что ошибок нет, но я не знаю, куда идти дальше.Спасибо!

Ответы [ 3 ]

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

Я думаю, вам нужно преобразовать ваш список Situation элементов в список SelectListItem.Это должно быть что-то вроде:

ViewBag.Situations = _context.Situations
    .Select(situation => new SelectListItem { Text = situation.XXX, Value = situation.YYY })
    .ToList();

А затем, на ваш взгляд:

@Html.DropDownList("SituationID", ViewBag.Situations, "Pick One: ", new { @class = "form-control" })

Где XXX и YYY - это свойства, которые вы хотите использовать в качестве отображаемого текстаэлемент и идентификатор элемента (соответственно).

Вы также можете взглянуть на Использование полного помощника DropDownList с ASP.NET MVC для полного примера.

Надеюсь, это поможет!

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

Если у вас есть коллекция объектов, таких как объекты ситуаций, которые имеют много свойств, таких как ExitURL и Caption, и вы указываете некоторому помощнику по списку использовать коллекцию в качестве источника данных для списка, он не может знать, какое свойство вы хотеливыбрать в качестве текста на дисплее.В результате он просто вызывает ToString для каждого объекта и использует то, что возвращается в качестве отображаемого текста.В реализации по умолчанию ToString возвращает представление типа объекта - это то, что вы видите

Таким образом, у вас есть выбор;

  • сохраните в вашем текущем стиле и переопределите ToString, чтобы он возвращал текст для вашего отображения,
  • уменьшите коллекцию объектов ситуаций в коллекцию строк (для каждой ситуации создайте строкупредставляете его из любых свойств, которые вам нравятся) и используйте эту коллекцию строк в качестве драйвера списка или
  • преобразуйте коллекцию в коллекцию SelectListItem, чтобы предоставить помощнику по списку доступ к коллекции объектов, которые он знает, как работатьс - таким образом вы можете указать, какое свойство ситуаций вы хотите использовать для различных атрибутов результирующего HTML (например, используйте ExitUrl в качестве значения элемента управления HTML и заголовок в качестве отображаемого текста).То, где вы делаете это преобразование, вероятно, зависит от того, как вам нужно повторно использовать ваши данные
0 голосов
/ 30 декабря 2018

это не проблема Ef.это ваша вина в рендеринге DropDownList.Вы должны изменить свою схему данных на правильную структуру данных, такую ​​как Словарь или класс Value-Text (SelectList).а затем привяжите его к своему DropDown.

это пример кода для вашей проблемы:

ViewBag.SituationList = _context.Situations.Select( x=> new SelectListItem{Value= x.Id, , Text= x.SituationName}).ToList();

, а затем привяжите его к вашему раскрывающемуся списку, используя этот код:

@Html.DropDownListFor(model => model.label, (SelectList)ViewBag.SituationList)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...