Почему я получаю эту ошибку с RazorPage при выполнении сообщения? - PullRequest
0 голосов
/ 05 марта 2019

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

1 Ответ

0 голосов
/ 06 марта 2019

Я знаю, что это как-то связано с DI, но я никогда не мог придумать, что это было.Я изменил свой подход и решил проблему с помощью следующего кода:

Я избавился от привязки SelectList к модели и сейчас делаю это:

public IActionResult OnGet()
    {
        var makeQuery = from m in _context.CarMake
            orderby m.Name
            select m;

        ViewData["Makes"] = makeQuery.Select(n => new SelectListItem
            {
                Value = n.MakeId.ToString(),
                Text = n.Name
            }).ToList();

        return Page();
    }

И интерфейскод:

<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="@((List<SelectListItem>)ViewData["Makes"])">
            <option value="-1">-- Select Make --</option>
        </select>
    </div>
</div>
...