我有查看下拉菜单的问题。这是我的代码。模型:
public class student
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int StudentId { get; set; }
[Display(Name = "Šifra ispitanika:")]
[Range(1, 9999)]
public int StudentNumber { get; set; }
[Display(Name = "Datum rođenja ispitanika:")]
[DataType(DataType.Date)]
public DateTime DateBirth { get; set; }
[Display(Name = "Mjesto rođenja ispitanika:")]
public string PlaceBirth { get; set; }
[Display(Name = "Datum testiranja ispitanika:")]
[DataType(DataType.Date)]
public DateTime TestDate { get; set; }
[Display(Name = "Godina rođenja majke:")]
[Range(1900, 2000)]
public int MumDate { get; set; }
[Display(Name = "Godina rođenja oca:")]
[Range(1900, 2000)]
public int DadDate { get; set; }
[Display(Name = "Dropdown_test:")]
public string MumSport { get; set; }
[NotMapped]
public List<SelectListItem> MumSports { set; get; }
}
控制器:
public async Task<IActionResult> Create([Bind("StudentId,StudentNumber,DateBirth,PlaceBirth,TestDate,MumDate,DadDate,MumSports")] student student)
{
if (ModelState.IsValid)
{
var MumSports = new student
{
MumSports = new List<SelectListItem>
{
new SelectListItem { Text = "nikako", Value = "1" },
new SelectListItem { Text = "rekreativno", Value = "2" },
new SelectListItem { Text = "amaterski", Value = "3" },
new SelectListItem { Text = "profesionalno", Value = "4" }
}
};
_context.Add(student);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(student);
}
视图:
<select asp-for="StudentId" asp-items="@(ViewBag.MumSports)">
<option>Please select one</option>
</select>
</div>
问题是关于View,当我运行我的应用程序时,它会显示下拉列表但没有我在控制器中创建的数据。我认为这不是创建View的好方法。任何的想法 ??
当您使用服务器派生信息填充页面上的任何内容时,您需要确保的一件事是您正确传递它。
从您的角度来看,我可以看到您正在寻找ViewBag.MumSport。因此,这意味着在您的操作的“获取”请求中,您将需要使用相关值填充ViewBag.MumSport。
您编写的控制器看起来有点令人困惑......我们通常希望有一个“get(动词)”控制器,您可以使用它来设置页面。我们通常会为下拉列表创建值,并填充页面所需的任何内容。通常,此处不会保存数据。但是,似乎您将下拉列表保存到数据库?
我相信你可能想要这样的东西:
public IActionResult Create()
{
ViewBag.MumSport = new List<SelectListItem>
{
new SelectListItem { Text = "nikako", Value = "1" },
new SelectListItem { Text = "rekreativno", Value = "2" },
new SelectListItem { Text = "amaterski", Value = "3" },
new SelectListItem { Text = "profesionalno", Value = "4" }
}
return View();
}
[HttpPost]
public IActionResult Create(view model goes in here)
{
Business logic goes here
}
这应该意味着您的下拉列表会被填充,但它也会显示post和get方法之间的区别。 Post通常是您在商店(数据库)中创建或保存信息的地方。
希望这可以帮助
更新而不是将所有属性作为post方法的签名的一部分,您可以尝试使用您创建的模型:
public async Task<IActionResult> Create(student viewModel)
然后,您需要确保表单上的输入项具有与viewmodel(student)匹配的名称:
<select asp-for="StudentId" asp-items="@(ViewBag.MumSports)">
如果这样做,当您点击控制器时,属性应自动绑定到viewModel。以这种方式执行此操作的另一个好处是,ModelState.IsValid将查看该类中的所有属性,并在您提交表单时对它们执行验证。当使用[Required]属性根据需要设置字段时,这尤其有用