【问题标题】:How to make a drop-down list in the view containing items from the database?如何在包含数据库项目的视图中创建一个下拉列表?
【发布时间】:2019-12-24 15:05:31
【问题描述】:

在我的一个视图中,专门为 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 方法的一个小sn-p。基本上,我通过存储过程连接到数据库Select * FROM Releases并填写最终存储在ViewBag中的列表。

创建.cshtml

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

以上是视图中的代码。我认为这是一个问题,因为我的列表看起来像这样:

他们的号码没问题,但我错过了什么?为什么不显示他们的名字?

因此:

  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);

【问题讨论】:

  • Release 类中覆盖ToString() 方法对您有帮助吗?
  • @PavelAnikhouski,您的意思是在Release 模型类中?我不太清楚你所说的 ToString() 方法是什么意思。

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


【解决方案1】:

Gauravsa 的回答是正确的,这是另一种方法。

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

【讨论】:

  • 谢谢!但是,之后,如何将值传递给控制器​​?我编辑了原始帖子以包含POST Create 方法。现在,Value = dependency.ReleaseId, 应该得到插入的值。如何将所选项目传递给此值?
  • 您在 .cshtml 中传递了一个“@model”,并且该模型具有 asp-for="Id" 字段。因此,您的“模型”会将您的值传递给您的控制器。
  • 别管最后一个了,我已经修好了!非常感谢!
【解决方案2】:

您可以更改控制器端代码:

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

在客户端,您可以使用:

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

【讨论】:

  • 谢谢!但是,之后,如何将值传递给控制器​​?我编辑了原始帖子以包含POST Create 方法。现在,Value = dependency.ReleaseId, 应该得到插入的值。如何将所选项目传递给此值?
【解决方案3】:

您可以使用常规下拉菜单轻松获取此内容

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多