使用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");
}
});
编辑:一切工作都很好,直到我将“制造/模型”选择列表添加到解决方案中为止。页面加载正常,只要单击提交按钮,我就会收到错误消息。
答案 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>