我在查看下拉菜单时遇到问题。这是我的代码。 型号:
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的好方法。知道吗??
答案 0 :(得分:0)
当您使用服务器派生的信息填充页面上的任何内容时,需要确保的一点是正确地传递了信息。
从您的角度来看,我可以看到您正在寻找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方法的签名的一部分:
public async Task<IActionResult> Create(student viewModel)
然后,您需要确保表单上的输入项的名称与viewmodel(学生)相匹配:
<select asp-for="StudentId" asp-items="@(ViewBag.MumSports)">
如果执行此操作,则在按下控制器时,属性应自动绑定到viewModel。这样做的另一个好处是,ModelState.IsValid然后将查看该类中的所有属性,并在提交表单时对其进行验证。当使用[Required]属性按要求设置字段时,此功能特别有用