如何创建下拉菜单视图?

时间:2019-04-16 19:08:04

标签: c# asp.net-mvc asp.net-core razor dropdown

我在查看下拉菜单时遇到问题。这是我的代码。 型号:

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的好方法。知道吗??

1 个答案:

答案 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]属性按要求设置字段时,此功能特别有用