SelectList в ASP.NET Core 6

Выбранное значение не работает в SelectList

сущность "Материал"

public class Material
{
    public int Id { get; set; }
    public string? Name { get; set; }
    public string? Unit { get; set; }
    public double? Count { get; set; }
    public double? Amount { get; set; }
    public double? Cost { get; set; }
}

часть кода контроллера

public async Task<IActionResult> Material{
    ...

    ViewData["Material"] = new SelectList(await Materials(), "Id", "Name",
                 sqlParameters[0].Value);
}

часть кода для просмотра

<select asp-for = "Material" class = "form-control" asp-items = "ViewBag.Material"></select>

Я пытался передать выбранное значение тремя способами

  1. ViewData["Материал"] = новый SelectList(ожидание материалов(), "Идентификатор", "Имя", 21);

  2. ViewData["Материал"] = новый SelectList(ожидание материалов(), "Идентификатор", "Имя", «21»);

  3. ViewData["Материал"] = новый SelectList(ожидание материалов(), "Идентификатор", "Имя", «Сыворотка»);

Но у меня нет ошибок. В списке выбора я вижу первый элемент вместо второго. Список предметов показывает, что все в порядке, и у меня здесь нет проблем.

Что такое Materials, какого он типа, какие данные там присутствуют?

Guru Stron 11.04.2023 18:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я только что проверил ваш код, и он работает для меня. Вы можете попробовать это без базы данных:

public async Task<IActionResult> OnGetAsync()
{
       var materials = new List<Material>
       {
            new Material
            {
                Name = "Test",
                Id = 1
            },
            new Material
            {
                Name = "Test2",
                Id = 2
            }
        };
        ViewData["Material"] = new SelectList(materials, "Id", "Name", 2);
        return Page();
}

И в файле .cshtml:

<select asp-items = "ViewBag.Material"></select>

А вы уверены, что ваш код вызывается? Имя функции Material не вызывается фреймворком. Если вы хотите, чтобы ваш код выполнялся по HTTP-запросу GET, вам нужно переименовать метод в OnGetAsync

Ответ принят как подходящий

Выбранное значение не работает в SelectList. Но у меня нет ошибок. В списке выбора вместо этого я вижу первый элемент секунды. Список предметов показывает, что все в порядке, и у меня нет проблемы здесь.

На самом деле, моя первая точка зрения на ваш <select asp-for = "Material"> это тип SelectList, который ожидает список элементов, я не совсем уверен, что вы поделились правильной моделью, потому что здесь нам нужно что-то типа selectList of List Of Object, но ваш общий материал является единым классом.

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

В вашем сценарии это идентификатор 21 (Whey), который вы пытаетесь сохранить выбранным. Но строка не будет правильным параметром, который является ключом, но нам нужно значение.

Как я воспроизвожу вашу проблему:

Модель:

 public class MaterialClass
    {
        public int Id { get; set; }
        public string? Name { get; set; }

    }

Примечание. Только с учетом ваших полей «Идентификатор» и «Имя».

Просмотр модели:

public class MaterialViewModel
    {
        public List<SelectListItem> MaterialClassList { get; set; }
    }

Примечание. Поскольку нам нужен список элементов, я создал модель представления SelectListItem внутри <select asp-for = "ListTypeObject">, таким образом, взяв эту модель представления. Однако это не обязательно, вы все равно можете использовать класс Material.

Контроллер:

public async Task<IActionResult> Material()
        {


            ViewData["Material"] = new SelectList(await Materials(), "Id", "Name", 21);
            return View();
                         
        }

Материалы () Метод:

Поскольку вы не предоставили сведения о методе Materials, предполагается, что он возвращает список ваших объектов MaterialClass. Следовательно, я воспроизвел следующее:

public async Task<List<MaterialClass>> Materials()
        {
            var materials = new List<MaterialClass>()
                 {
                  new MaterialClass {Name = "Milk", Id = 20},
                  new MaterialClass {Name = "Whey", Id= 21},
                  new MaterialClass {Name = "Jgv", Id = 22},
                 };
            return materials;
        }

Вид:

@model MyProject.ModelFolder.MaterialViewModel

<select asp-for = "MaterialClassList" class = "form-control" asp-items = "ViewBag.Material"></select>

Отлаживать:

Выход:

Примечание. Если вы заметили вывод, я получаю ожидаемый результат. Просто убедитесь в своем sqlParameters[0].Value и попробуйте отладить и проверить, имеет ли выбранный объект значения правильные параметры.

Другие вопросы по теме

Как связать тело выборки с параметром объекта действия контроллера в ASP.NET Core
Строка подключения ядра ASP.Net в переменных среды. Рекомендации по обеспечению безопасности
Ссылка на файл bootstrap css из основного проекта .NET
Отдельные экземпляры DbContext, последовательно выполняющие разные операции для одной и той же записи, не работают должным образом
Обновлять заявки пользователей на сайте, если заявки изменились в базе данных моего сервера идентификации
Как переменные Azure Dev Ops связаны с публикацией dotnet (или msbuild)?
Получить данные о событии изменения выбранного вспомогательного тега
Включить/отключить элементы управления на веб-странице бритвы с помощью методов расширения Asp .Net 7
Docker для рабочей службы net7, работающей в контейнере linux, не работает
Пользователь IIS получает доступ к общей сетевой папке на сервере рабочей группы