如何为下拉菜单创建视图?

问题描述 投票:0回答:1

我有查看下拉菜单的问题。这是我的代码。模型:

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的好方法。任何的想法 ??

c# asp.net-mvc asp.net-core razor dropdown
1个回答
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通常是您在商店(数据库)中创建或保存信息的地方。

希望这可以帮助

更新而不是将所有属性作为post方法的签名的一部分,您可以尝试使用您创建的模型:

public async Task<IActionResult> Create(student viewModel)

然后,您需要确保表单上的输入项具有与viewmodel(student)匹配的名称:

<select asp-for="StudentId" asp-items="@(ViewBag.MumSports)">

如果这样做,当您点击控制器时,属性应自动绑定到viewModel。以这种方式执行此操作的另一个好处是,ModelState.IsValid将查看该类中的所有属性,并在您提交表单时对它们执行验证。当使用[Required]属性根据需要设置字段时,这尤其有用

© www.soinside.com 2019 - 2024. All rights reserved.