Заполните раскрывающийся список с Razor в Netcore 2.0 - PullRequest
0 голосов
/ 05 ноября 2018

Я совершенно новичок в MVVC и весь стек на netcore.

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

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

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 значения необходимо заполнить, получая информацию из таблицы «Автомобили», я создал класс для получения информации, но я не знаю, правильный ли это подход.

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, чтобы я мог заполнить свои выборы? Спасибо и извините за неудобства.

1 Ответ

0 голосов
/ 05 ноября 2018

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

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>
...