Я пытаюсь отобразить выбранное значение в раскрывающемся списке при вызове действия Edit
. В настоящее время мой код отображает следующее в раскрывающемся списке. Значение отображается с помощью метода @Html
.
@Html.EditorFor(model => model.Projectname)
Однако я пытаюсь добиться того, чтобы можно было перенести выбранное значение в раскрывающийся список. Я пытался сохранить раскрывающийся список в ViewBag
, но он отображает WebDSR.Models.DTO.Project
.
Вместо этого должно отображаться имя проекта - выбранные значения из базы данных.
Amazon
Walmart
Myntra
Метод действия контроллера:
public IActionResult Edit(int id)
{
ViewBag.Project = new SelectList(db.Defects
.Where(x => x.DefectId == id)
.Select(x => new Project() { ProjectId = x.ProjectId, ProjectName = x.ProjectName}));
return View(db.Defects.Find(id));
}
Вид
<select asp-items = "ViewBag.Project" class = "form-control"></select>
Буду признателен за любую оказанную помощь.
Вы имеете в виду выбрать значение после того, как пользователь выберет элемент и отправит обратно страницу? Или вы имеете в виду выбрать значение по умолчанию при первом отображении страницы?
Вероятно, вам не хватает @
для ссылки на переменную на странице Razor. <select asp-items = "@ViewBag.Project" class = "form-control"></select>
Поскольку вы предоставляете список IEnumerable
типа класса модели вместо IEnumerable<SelectListItem>
, вам необходимо указать имена свойств для значения параметра и метки в соответствии с SelectList(IEnumerable, String, String).
ViewBag.Project = new SelectList(
db.Defects
.Select(x => new Project() { ProjectId = x.ProjectId, ProjectName = x.ProjectName }),
nameof(Project.ProjectId),
nameof(Project.ProjectName)
);
На странице Razor вам не хватает @
для ссылки на ViewBag.Project
.
@model YourModel
<select asp-items = "@ViewBag.Project" class = "form-control" asp-for = "Id"></select>
ценим ваше предложение. Я устал от приведенного выше кода, он отображает только выбранное значение, я хотел, чтобы он отображал все остальные значения вместе с выбранным. Как этого можно было достичь?
Привет @Rezo, обновил мой ответ. 1. Не следует применять фильтрацию .Where()
по дефектам, вместо этого следует вернуть все записи из Defects
DBSet. 2. Вы можете использовать атрибут asp-for
, таким образом он выберет вариант соответствия на основе свойства Id
.
Еще раз спасибо, появляется раскрывающийся список с другими параметрами выбора, но по умолчанию должен использоваться тот, который уже выбран, а не неправильный выбор. Пример: значение в db = Amazon, поэтому, когда мы загружаем действие «Редактировать», в раскрывающемся списке должен быть выбран Amazon, а за ним следуют другие параметры выбора.
Если вы используете атрибут asp-for
, раскрывающийся список выбора автоматически выберет опцию на основе Id
. Я не могу знать, какой у вас класс Defect
, возможно, из-за того, что свойство ссылки в asp-for
неверно. Либо вам нужно попробовать asp-for = "DefectId"
на основе того, что я вижу в контроллере, либо поделитесь своим классом модели в вопросе. Спасибо.
Спасибо, вот что я сделал. общественный IEnumerable ListProject {get; набор; } Установите список выбора в классе модели. В контроллере передан список в модели вместо ViewBag, как в этой модели.ListProject = логика, и, наконец, вызван список в представлении, используя идентификатор, как вы предложили. и это сработало. Спасибо.
Еще одна вещь: как мы можем выполнить то же действие, но не в действии РЕДАКТИРОВАНИЕ, а в том, чтобы перечислить полный список в представлении. Можно ли этого добиться?
Отлично, это работает и в представлении списка, но данные пришлось передавать в ViewBag вместо МОДЕЛЬ.
Я рекомендую вам сделать выбор в контроллере и передать данные в модель, без необходимости использовать ViewBag. Каково будет содержимое ViewBag.Project, если вы установите точку останова?