ASP. Net Core SelectList не отображает выбранный элемент - PullRequest
0 голосов
/ 23 января 2020

Использование ASP. Net core 2.2 в VS 2017 (MVC):

У меня есть экран на основе мастера, в котором есть раскрывающийся список организаций. Когда я загружаю запись из базы данных, я хочу установить список выбора для значений в БД.

Оповещение о спойлере: указанный элемент не выбирается при первоначальном отображении страницы.

При выборе элемента вручную, нажатии кнопки «Далее» и нажатии кнопки «Предыдущий» возвращая нас на первую страницу, элемент выбирается так, как я намереваюсь.

Ни один из методов ниже не устанавливает свойство «Выбрано» выбранного элемента («0403») при загрузке модели в контроллер для первого показа.

Сравнение в методе 2 никогда не оценивается как true, хотя я вижу, что сравниваемые значения равны при отладке.

Метод 3 не находит элемент, даже если я вижу, что сравниваемые значения равно при отладке

Метод 4 не находит элемент, хотя я вижу, что сравниваемые значения равны при отладке

Все это происходит в контроллере, поэтому, пожалуйста, не предлагайте менять имя раскрывающегося списка в представлении.

** Таблица организации

ORG ID      OrgName**

0004        Org 4

0007        Org 7

0008        Org 8

0403        Org 403

Это мой исходный запрос:

var orgsQuery = from s in _context.Orgs
                           orderby s.OrgID
                           select s;

Это различные способы, которые я пытался построить Список выбора в контроллере:

1).

       SelectList oList = new SelectList(orgsQuery.AsNoTracking(), "OrgID", "OrgName", selectedOrg);

2).

        List<SelectListItem> oList = new List<SelectListItem>();
        foreach ( var item in OrgsQuery)
        {
            oList.Add(new SelectListItem()
            {
                Text = item.OrgName,
                Value = item.OrgID,
                Selected = (item.OrgID == (string)selectedOrg ? true : false)
            });
        }

3).

        if (selectedOrg != null)
        {
         oList = new SelectList(OrgsQuery.AsNoTracking(),"OrgID", "OrgName", OrgsQuery.First(s => 
            s.OrgID == (string)selectedOrg));
        }
        else
        {
        oList = new SelectList(OrgsQuery.AsNoTracking(), "OrgID", "OrgName", selectedOrg);
        }

4).

  SelectList oList =
           new SelectList(_context.Org.OrderBy(r => r.OrgID), 
         _context.Org.SingleOrDefault(s => s.OrgID == (string)selectedOrg))

1 Ответ

0 голосов
/ 23 января 2020

Что ж, предположим, что selectedOrg type имеет число c, чем его следует преобразовать в форматированную строку, следуя формату OrgID:

var formattedSelectedOrg = String.Format("{0:0000}", selectedOrg);

или

// if selectedOrg is nullable numeric type
var formattedSelectedOrg = selectedOrg?.ToString("0000");

// if selectedOrg is base numeric type
var formattedSelectedOrg = selectedOrg.ToString("0000");

// if selectedOrg is String type (nullable)
var formattedSelectedOrg = selectedOrg?.Trim().PadLeft(4, '0');

Or

var number;
var formattedSelectedOrg =
    String.Format("{0:0000}", Int32.TryParse(selectedOrg?.Trim(), out number) ? number : 0);

Так что это будет сопоставимо применительно к вашим кодам:

// assume selectedOrg is base numeric type
Selected = item.OrgID == selectedOrg.ToString("0000")

Or

// if selectedOrg is String type (nullable)
Selected = item.OrgID == selectedOrg?.Trim().PadLeft(4, '0')

Or

// if you prefer to use predefined formatted string
Selected = item.OrgID == formattedSelectedOrg

И

// assume selectedOrg is base numeric type
s => s.OrgID == selectedOrg.ToString("0000")

Or

// if selectedOrg is String type (nullable)
s => s.OrgID == selectedOrg?.Trim().PadLeft(4, '0')

Or

// if you prefer to use predefined formatted string
s => s.OrgID == formattedSelectedOrg

Проверьте это: Пользовательская цифра c строки формата Метод String.PadLeft

Также этот важный портфель: Пад осталось с нулями

Надеюсь, это поможет. Приятного кодирования!

...