为什么执行帖子时我在RazorPage中收到此错误?

时间:2019-03-05 05:50:30

标签: c# asp.net-core razor-pages

使用RazorPages并从SQL DB填充SelectList时遇到了我似乎无法弄清的问题。我遵循了有关将数据绑定到选择列表的教程,现在,当我发布表单时,它爆炸并显示以下错误:

  

InvalidOperationException:无法创建类型为“ Microsoft.AspNetCore.Mvc.Rendering.SelectList”的实例。模型绑定的复杂类型不能为抽象或值类型,并且必须具有无参数构造函数。或者,在“ TestProject.Pages.IndexModel”构造函数中将“ CarMakeList”属性设置为非空值。

我有以下代码:

 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文件快死了。Invoke()

 app.Use(async (context, next) =>
        {
            await next.Invoke();

            if (context.Response.StatusCode == StatusCodes.Status404NotFound)
            {
                context.Response.Redirect("/AndItsGone");
            }
        });

编辑:一切工作都很好,直到我将“制造/模型”选择列表添加到解决方案中为止。页面加载正常,只要单击提交按钮,我就会收到错误消息。

1 个答案:

答案 0 :(得分:0)

我知道这与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>