CRUD — Создание выпадающего списка выбора автоматически заполняет другое поле ввода ASP.NET Бритвенные страницы

#c# #asp.net #linq #asp.net-core #razor-pages

Вопрос:

Я пытаюсь создать что-то вроде поля со списком в excel. При выборе Сайта будет автоматически выбран номер вакансии и Менеджер. Сайт, JobNum и менеджер находятся в отдельной таблице, называемой master. В настоящее время в форме создания, которую я пытаюсь выполнить, все они представляют собой выпадающий список, который извлекается из главной таблицы бд.

Редактировать — Забыл упомянуть, что главная таблица имеет простой идентификатор, просто добавочный от 1. Добавлено изображение того, как оно выглядит из БД

Вот как это выглядит в настоящее время

Главный стол

Как я хочу, чтобы это было — выбрав сайт, автоматически заполните два нижних

Главная таблица из базы данных, показывающая все столбцы

Код для списка избранных:

         public SelectList PYSiteSL { get; set; }
        public SelectList PYManagerSL { get; set; }
        public SelectList PYJobNumSL { get; set; }

        public void PopulateSiteDropDownList(FinanceAppARContext _context, object selectedSiteList = null)
        {
            var siteQuery = from s in _context.master
                            select s.Site;
            PYSiteSL = new SelectList(siteQuery.Distinct().AsNoTracking(), selectedSiteList);
        }
        public void PopulateManagerDropDownList(FinanceAppARContext _context, object selectedManagerList = null)
        {
            var managerQuery = from m in _context.master
                               select m.Manager;
            PYManagerSL = new SelectList(managerQuery.Distinct().AsNoTracking(), selectedManagerList);
        }

        public void PopulateJobNumDropDownList(FinanceAppARContext _context, object selectedJobNumList = null)
        {
            var jobnumQuery = from j in _context.master
                              select j.JobNum;
            PYJobNumSL = new SelectList(jobnumQuery.Distinct().AsNoTracking(), selectedJobNumList);
        }


        private readonly FinanceApp.Models.FinanceAppARContext _context;

        public CreateModel(FinanceApp.Models.FinanceAppARContext context)
        {
            _context = context;
        }

        public IActionResult OnGet()
        {
            PopulateSiteDropDownList(_context, PYSiteSL);
            PopulateManagerDropDownList(_context, PYManagerSL);
            PopulateJobNumDropDownList(_context, PYJobNumSL);

            return Page();
        }

 

а это интерфейс .cshtml

 //Site
            <div class="form-group">
                <label asp-for="py21.Sites" class="control-label"></label>
                <select asp-for="py21.Sites" asp-items="Model.PYSiteSL" class="form-control chosen-select"><option disabled selected>-- Select Site --</option></select>
                <span asp-validation-for="py21.Sites" class="text-danger"></span>
            </div>
//Manager
            <div class="form-group">
                <label asp-for="py21.Manager" class="control-label"></label>
                <input asp-for="py21.Manager" class="form-control" readonly />
                @*<select asp-for="py21.Manager" asp-items="Model.PYManagerSL" class="form-control chosen-select"><option disabled selected>-- Select Manager --</option></select>*@
                <span asp-validation-for="py21.Manager" class="text-danger"></span>
            </div>
//JobNum
            <div class="form-group">
                <label asp-for="py21.JobNum" class="control-label"></label>
                <input asp-for="py21.JobNum" class="form-control" readonly />
                @*<select asp-for="py21.JobNum" asp-items="Model.PYJobNumSL" class="form-control chosen-select"><option disabled selected>-- Select Job Number --</option></select>*@
                <span asp-validation-for="py21.JobNum" class="text-danger"></span>
            </div>
 

Отредактировал то, что сказал @Stripling Warrior, опечатка.

Комментарии:

1. Вы заметили, что ушли asp-for="py21.Manager" в последний <input раз ?

2. О боже, да, спасибо за место, я быстро отредактировал его для этого вопроса, так как изначально это был список выбора без решения, так что это копипаст. @StriplingWarrior

Ответ №1:

На этой .cshtml.cs странице вы можете создать метод обработчика для извлечения данных на основе выбранного сайта. Затем на .cshtml странице вы можете прикрепить onchange событие выпадающего списка, в этом случае получите выбранное значение выпадающего списка и используйте JQuery.Ajax его для вызова метода обработчика и получения соответствующего номера задания и менеджера, затем установите значение текстового поля.

Для получения более подробной информации, пожалуйста, обратитесь к следующему образцу:

Создайте следующие модели:

 public class PYViewModel //page view model
{
    public string Sites { get; set; }
    public string Manager { get; set; }
    public string JobNum { get; set; }
}

public class MasterModel //EF entity
{
    [Key]
    public string JobNum { get; set; }
    public string Site { get; set; }
    public string Manager { get; set; }
    public bool IsActive { get; set; }
}
 

DbContext:

 public class ApplicationDbContext : IdentityDbContext
{  
    public DbSet<MasterModel> Masters { get; set; }
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}
 

После переноса и добавления данных, основная таблица, как показано ниже:

введите описание изображения здесь

страница .cshtml.cs:

 public class PYPageModel : PageModel
{
    [BindProperty]
    public PYViewModel py21 { get; set; }
    public SelectList PYSiteSL { get; set; }  
    //you could change the applicationdbcontext to yours.
    private readonly ApplicationDbContext _context;
    public PYPageModel(ApplicationDbContext context)
    { 
        _context = context;
    }
    public void OnGet()
    { 
        //query the master table.
        PYSiteSL = new SelectList(_context.Masters.Distinct().ToList(), nameof(MasterModel.Site), nameof(MasterModel.Site));
    }
    public JsonResult OnGetGetJobNumManager(string selectSite)
    {
        //based on the selected site to filter data.
        return new JsonResult(_context.Masters.Distinct().Where(c=>c.Site == selectSite).Distinct().ToList());
    }
}
 

.страница cshtml:

 @page
@model RazorPageSample.Pages.PYPageModel
<form method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="py21.Sites" class="control-label"></label>
        <select asp-for="py21.Sites" asp-items="Model.PYSiteSL" id="ddlsite" class="form-control chosen-select"><option disabled selected>-- Select Site --</option></select>
        <span asp-validation-for="py21.Sites" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="py21.Manager" class="control-label"></label>
        <input asp-for="py21.Manager" class="form-control" readonly />
        @*<select asp-for="py21.Manager" asp-items="Model.PYManagerSL" class="form-control chosen-select"><option disabled selected>-- Select Manager --</option></select>*@
        <span asp-validation-for="py21.Manager" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="py21.JobNum" class="control-label"></label>
        <input asp-for="py21.JobNum" class="form-control" readonly />
        @*<select asp-for="py21.JobNum" asp-items="Model.PYJobNumSL" class="form-control chosen-select"><option disabled selected>-- Select Job Number --</option></select>*@
        <span asp-validation-for="py21.JobNum" class="text-danger"></span>
    </div>
</form>
    @section Scripts{
        <script>
            $(function () {
                $("#ddlsite").on("change", function () {
                    var site = $(this).val();
                    $.ajax({
                        url: `?handler=GetJobNumManageramp;selectSite=${site}`, 
                        type: 'Get', 
                        beforeSend: function (xhr) {
                            xhr.setRequestHeader("XSRF-TOKEN",
                                $('input:hidden[name="__RequestVerificationToken"]').val());
                        },
                        success: function (result) {
                            var manager = [];
                            var JobNum = [];
                            $.each(result, function (i, item) {
                                manager.push(item.manager);
                                JobNum.push(item.jobNum);
                            }); 
                            $("#py21_Manager").val(manager.join(","));
                            $("#py21_JobNum").val(JobNum.join(","));
                        }, 
                        error: function (response) {
                            alert(response.responseText);
                        },
                        failure: function (response) {
                            alert(response.responseText);
                        }
                    });
                });
            });
        </script>
    }
 

Результат, как показано ниже:

введите описание изображения здесь

Комментарии:

1. Спасибо за подробный ответ! Похоже, ты это сделал, и твое работает как заклинание. Однако я не уверен, где или что я сделал не так. У меня уже есть 2 модели, py и master, я следовал вашему последующему шагу для страницы .cshtml.cs, но на GetMasters() У меня есть»… не содержит определения и не содержит доступного метода расширения».

2. Метод IDataRepository и GetMasters() метод, используемый для установки исходного источника данных (мастер) для мастера, вы можете изменить его в своем коде, запросить базу данных через DbContext и получить мастер.

3. На стороне клиента используйте инструменты разработчика F12, чтобы добавить точку останова в change событие раскрывающегося списка, а затем проверьте change , инициировано ли событие или нет. Затем в методе обработчика вы также можете установить точку останова, затем отладить приложение и проверить, вызывается ли этот метод или нет? Если нет, проверьте URL-адрес в jQuery Ajax.

4. Что делать, если у меня уже есть все данные в базе данных, нужно ли мне добавлять их вручную вот так new MasterModel(){ JobNum="T1900003", Site="AIR LIQ", Manager="CLIVE", IsActive=true}, ? У меня их более сотни.

5. Нет. Если у вас уже есть все данные в базе данных, просто запросите базу данных через DbContext, тогда вы сможете получить все мастера.