如何在包含数据库项的视图中创建下拉列表?

时间:2019-12-23 12:25:53

标签: c# html .net asp.net-core

在我的为Create方法专门创建的视图中,我需要在下拉列表中显示Name的某些内容,并在选中后传递其Id到控制器。

使用我的代码,我已经很接近了-但是,我不觉得这实际上是应该完成的方式。谨请您向我提供更有效的建议,我们非常欢迎任何提示和提示!

DependencyController.cs

public IActionResult Create()
    {
        List<Release> releaseList = new List<Release>();
        List<Phase> phaseList = new List<Phase>();
        List<TaskModel> taskList = new List<TaskModel>();

        string connectionString = Configuration["ConnectionStrings:DefaultConnection"];
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            string sql = "ReadReleases";
            SqlCommand command = new SqlCommand(sql, connection);
            command.CommandType = CommandType.StoredProcedure;

            using (SqlDataReader dataReader = command.ExecuteReader())
            {
                while (dataReader.Read())
                {
                    Release release = new Release();
                    release.Id = Convert.ToInt32(dataReader["Id"]);
                    release.Name = Convert.ToString(dataReader["Name"]);
                    releaseList.Add(release);
                }
            }

            ViewBag.Releases = releaseList;

这是来自控制器的Create方法的一小段。基本上,我通过存储过程连接到数据库Select * FROM Releases,并填写最终存储在ViewBag中的列表。

Create.cshtml

        <div class="form-group">
            <label asp-for="ReleaseName"></label>
            <select asp-items="@new SelectList(ViewBag.Releases)" asp-for="ReleaseName"></select>
        </div>

上面是视图中的代码。我认为这是一个问题,因为我的列表如下所示:

enter image description here

他们的电话没问题,但是我想念什么?为什么没有显示他们的名字?

因此:

  1. 要使我的列表显示正确的名称而不是Intersection.Models.Release,应该修正什么?
  2. 将所选项目传递给控制器​​时,还应该添加什么以获取Id而不是Name作为值?

编辑:

using (SqlConnection connection = new SqlConnection(connectionString))
        {
            string sql = "CreateDependency";

            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                SqlParameter parameter = new SqlParameter
                {
                    ParameterName = "@ReleaseId",
                    Value = dependency.ReleaseId,
                    SqlDbType = SqlDbType.Int,
                    Size = 50
                };
                command.Parameters.Add(parameter);

3 个答案:

答案 0 :(得分:2)

您可以更改控制器辅助代码:

ViewBag.Releases = new SelectList(releaseList, "Id", "Name");

在客户端,您可以使用:

@Html.DropDownList("Id", (IEnumerable<SelectListItem>)ViewBag.Releases, null, new { @class ="form-control" })

答案 1 :(得分:2)

Gauravsa的答案是正确的,这是另一种方式。

<select asp-items="@(new SelectList(ViewBag.Releases, "Id", "Name"))" asp-for="Id"></select>

答案 2 :(得分:0)

您可以通过常规下拉菜单轻松获取

<div class="form-group">
@Html.DropDownList("Id",new SelectList(@ViewBag.Releases,"Id","Name"),"Select")
</div> 
相关问题