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





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