Я столкнулся с чем-то, что не могу понять, используя RazorPages и заполняя SelectList из базы данных SQL.Я следовал руководству по привязке данных к списку выбора, и теперь, когда я публикую свою форму, она взрывается со следующей ошибкой:
InvalidOperationException: Не удалось создать экземпляр типа 'Microsoft.AspNetCore.Mvc.Rendering.SelectList.Сложные типы, связанные с моделью, не должны быть абстрактными или значениями и должны иметь конструктор без параметров.В качестве альтернативы, установите для свойства CarMakeList ненулевое значение в конструкторе TestProject.Pages.IndexModel.
У меня есть следующий код:
public class IndexModel : PageModel
{
private readonly IHostingEnvironment _hostingEnvironment;
private readonly IVehicleService _vehicleService;
private readonly ApplicationDbContext _context;
public IndexModel(IHostingEnvironment hostingEnvironment, IVehicleService vehicleService, ApplicationDbContext context)
{
_hostingEnvironment = hostingEnvironment;
_vehicleService = vehicleService;
_context = context;
}
public Filters Filters { get; set; }
public SelectList CarMakeList { get; set; }
public IActionResult OnGet()
{
PopulateMakeDropdownList();
return Page();
}
[BindProperty]
public IFormFile Upload { get; set; }
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
var file = Path.Combine(_hostingEnvironment.WebRootPath, "uploads", Upload.FileName);
using (var fileStream = new FileStream(file, FileMode.Create))
{
await Upload.CopyToAsync(fileStream);
}
HttpContext.Session.SetObject("CurrentFilters", Filters);
return RedirectToPage("vehicles");
}
public void PopulateMakeDropdownList(object selectedMake = null)
{
var makeQuery = from m in _context.CarMake
orderby m.Name
select m;
CarMakeList = new SelectList(makeQuery.AsNoTracking(), "MakeId", "Name", selectedMake);
}
public class CarMake
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("MakeId")]
public int MakeId { get; set; }
public string Name { get; set; }
}
Здесьмой класс фильтров
public class Filters
{
[Required]
public int Source { get; set; }
public int MmrPercentage { get; set; }
public int MaximumPrice { get; set; }
public int MinimumPrice { get; set; }
public int Transport { get; set; }
public int Recon { get; set; }
public int ExtraCost { get; set; }
public int MinimumOdometer { get; set; }
public int MaximumOdometer { get; set; }
public string InitialSortOption { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public int Year { get; set; }
}
Мой интерфейс выглядит следующим образом:
<div class="row">
<div class="form-group">
<label asp-for="Filters.Make">Vehicle Make:</label>
<select id="makeDropDownList" asp-for="Filters.Make" class="form-control"
asp-items="@Model.CarMakeList">
<option value="-1">-- Select Make --</option>
</select>
</div>
</div>
Я около часа возился и понятия не имею, почему он ломается.Он умирает в моем файле startup.cs в этом блоке кода на await next.Invoke ()
app.Use(async (context, next) =>
{
await next.Invoke();
if (context.Response.StatusCode == StatusCodes.Status404NotFound)
{
context.Response.Redirect("/AndItsGone");
}
});
Редактировать: Все работало отлично, пока я не добавил списки выбора Make / Model в решение.Страница загружается нормально, как только я нажимаю кнопку отправки, я получаю сообщение об ошибке.