Как настроить раскрывающееся меню, чтобы оно возвращало текстовое значение вместо его идентификатора? - PullRequest
0 голосов
/ 29 апреля 2020

Я довольно новичок в кодировании на бритвенных страницах и. NET ядре. Это может быть легко решить проблему, но я не могу найти ресурсы, чтобы помочь мне. Самая близкая, что я нашел, - это ссылка, но я либо не понимаю ее, либо не думаю, что она применима, потому что я стараюсь избегать использования контроллера как можно лучше, поскольку использую страницы Razor.

Как отобразить текст свойства вместо идентификатора в Razor MVC 3

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

    public class EmployeeNamePageModel : PageModel
    {
        public List<SelectListItem> EmployeeNameSL { get; set; }

        public void PopulateEmployeesDropDownList(ServiceContext _context)
         {
            EmployeeNameSL = _context.Employees_Informations.Select(a => new SelectListItem
            {
                Value = a.ID.ToString(),
                Text = a.employeename
            }).ToList();
         }
     }

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

    public class CreateModel : EmployeeNamePageModel
    {
        private readonly Template.Data.ServiceContext _context;

        public CreateModel(Template.Data.ServiceContext context)
        {
            _context = context;
        }

        public IActionResult OnGet()
        {
            PopulateEmployeesDropDownList(_context);
            return Page();
        }

        [BindProperty]
        public Service_Request_Information Service_Request_Information { get; set; }

        // To protect from overposting attacks, please enable the specific properties you want to bind to, for
        // more details see https://aka.ms/RazorPagesCRUD.
        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.Service_Request_Informations.Add(Service_Request_Information);
            await _context.SaveChangesAsync();

            return RedirectToPage("./Index");
        }

    }

Однако после сохранения страницы и ее индексации вместо имени сотрудника я вижу основной идентификатор. Моя работа сейчас заключается в том, чтобы просто не запрашивать идентификатор в функции PopulateEmployeesDropDownList и вместо этого запрашивать только имя сотрудника. Однако в конечном итоге мне нужно будет узнать идентификатор выбранного сотрудника, чтобы позднее я мог использовать его в функции для отправки по электронной почте этому человеку.

Итак, как я могу получить имя человека, которое будет отображаться на странице указателя, вместо идентификатора этого человека? Ответ в ссылке выше говорит об использовании модели представления, но он использует контроллер, если я правильно понимаю. С бритвенными страницами я понимаю, что контроллеры не нужны; поэтому я не хотел бы использовать их, если смогу помочь.

РЕДАКТИРОВАТЬ: Это мой код для просмотра раскрывающегося меню на странице создания. Раскрывающееся представление в порядке, это когда оно индексируется после отправки, это поле сохраняется как идентификатор.

            <div class="form-group">
                <label asp-for="Service_Request_Information.AssignedTech" class="control-label"></label>
                <select asp-for="Service_Request_Information.AssignedTech" class="form-control"
                        asp-items="Model.EmployeeNameSL">
                    <option value="">-- Select --</option>
                </select>
                <span asp-validation-for="Service_Request_Information.AssignedTech" class="text-danger"></span>
            </div>

1 Ответ

0 голосов
/ 30 апреля 2020

как я могу получить имя человека, который будет отображаться на странице индекса, вместо идентификатора этого человека?

Вы заполняете Value раскрывающегося списка <option> с идентификатором сотрудника a.ID.ToString(), поэтому выбранное значение (ID) будет опубликовано в данных формы и привязано к свойству указанной модели, а вы получил идентификатор сотрудника вместо Text из выбранных <option>.

. Чтобы выполнить ваше требование, вы можете попробовать следующий подход:

Добавить дополнительное свойство SelectedEmployeeName в классе модели

public class Service_Request_Information
{
    public string AssignedTech { get; set; }

    public string SelectedEmployeeName { get; set; }

    //other properties
}

Использование скрытого поля для сохранения имени выбранного сотрудника

<div class="form-group">
    <label asp-for="Service_Request_Information.AssignedTech" class="control-label"></label>
    <select asp-for="Service_Request_Information.AssignedTech" class="form-control"
            asp-items="Model.EmployeeNameSL" onchange="ddl_change_func(this);">
        <option value="">-- Select --</option>
    </select>

    <input id="selected_val" type="hidden" name="Service_Request_Information.SelectedEmployeeName" value="" />

    <span asp-validation-for="Service_Request_Information.AssignedTech" class="text-danger"></span>
</div>

Установка значения скрытого поля с выбранным текстом опции

<script>
    function ddl_change_func(el) {
        //code logic here...

        //set value of hidden field with selected option text
        var ename = $(el).find("option:selected").text();
        $("#selected_val").val(ename);
    }
</script>

Результат теста

enter image description here

...