Заполните раскрывающийся список с помощью Razor в Netcore 2.0

Я совершенно не знаком с MVVC и всем стеком по netcore.

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

В настоящее время у меня есть эта модель для моих форм автомобилей

using System;
namespace forms.Models
{
    public class CarQuote
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
        public string Year { get; set; }
        public string Version { get; set; }
        public string State { get; set; }
        public int ZipCode { get; set; }
    }
}

Бренд, модель, год и версия выбираются в моем пользовательском интерфейсе, эти 4 значения необходимо заполнить, получая информацию из моей таблицы Cars, я создал класс для получения информации, но я не делаю этого, если это правильный подход.

using System;
namespace forms.Models
{
    public class Cars
    {
        public string Brand { get; set; }
        public string Model { get; set; }
        public string Version { get; set; }
        public string Year { get; set; }
    }
}

Это также мой Create.cshtml.cs для формы автомобильного предложения.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using soofiforms.Models;

namespace forms.Pages.Car
{
    public class CreateModel : PageModel
    {
        private readonly soofiforms.Models.ModelContext _context;

        public CreateModel(soofiforms.Models.ModelContext context)
        {
            _context = context;
        }

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

        [BindProperty]
        public CarQuote CarQuote { get; set; }
        public Cars Cars { get; set; }

        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.CarQuotes.Add(CarQuote);
            await _context.SaveChangesAsync();

            return RedirectToPage("./Index");
        }
    }
}

Как я могу связать мою таблицу Cars с моей формой CarsQuote, чтобы я мог заполнить свой выбор? Спасибо и приносим извинения за неудобства.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
0
506
1

Ответы 1

Как правило, лучший способ - установить его в вашей модели представления. Другими словами, добавьте такие свойства, как:

public IEnumerable<SelectListItem> BrandOptions { get; set; }

Затем в вашем контроллере добавьте частный метод для заполнения этих списков параметров:

private Task PopulateOptionsAsync(CarQuote model)
{
    model.BrandOptions = await _context.Brands.Select(x => new SelectListItem
    {
        Value = x.Id.ToString(),
        Text = x.Name
    }).ToListAsync();

    // etc
}

Вызовите это затем в своем действии, прежде чем возвращать модель в представление. Лучше всего использовать его как частный метод, так как тогда вы можете поделиться им между версиями GET и POST вашего действия. Тогда, наконец, на ваш взгляд:

<select asp-for = "Brand" asp-items = "@Model.BrandOptions"></select>

Альтернативный подход - использовать внедрение представления с настраиваемой службой. Мне лично не нравится добавлять подобную логику к представлению, но Microsoft действительно представляет это как возможный вариант. По сути, вы просто создаете класс обслуживания, у которого есть методы для возврата ваших параметров:

public class CarQuoteOptionsService
{
    private readonly ModelsContext _context;

    public CarQuoteOptionsService(ModelsContext context)
    {
        _context = context ?? throw new ArgumentNullException(nameof(context));
    }

    public Task<List<SelectListItem>> GetBrandOptionsAsync =>
        _context.Brands.Select(x => new SelectListItem
        {
            Value = x.Id.ToString(),
            Text = x.Name
        }).ToListAsync();

    // etc
}

Затем зарегистрируйте это в ConfigureServices:

services.AddScoped<CarQuoteOptionsService>();

Наконец, введите его в свой контроллер и используйте по желанию:

@inject CarQuoteOptionsService OptionsService

...

<select asp-for = "Brand" asp-items = "@(await OptionsService.GetBrandOptionsAsync())"></select>

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