首页 > 解决方案 > 无法正确访问值下拉列表 asp mvc

问题描述

我是 asp mvc 的新手,所以我试图了解如何从下拉列表中获取选定的值。现在我想要在我的视图中将选定的值视为文本。在搜索了几个示例后,我在控制器中有以下代码:

public ActionResult Index()
        {
        TaskModel task = new TaskModel();
        task.Tasks = FillTaskList();          
        return View(task);
    }

    [HttpPost]
    public ActionResult Index(TaskModel task)
    {
        task.Tasks = FillTaskList();
        ViewBag.Message = task.TaskName;
        return View(task);
    }

    private static List<SelectListItem> FillTaskList()
    {
        List<SelectListItem> items = new List<SelectListItem>();
        string constr = ConfigurationManager.ConnectionStrings["contingentConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            string query = " SELECT TaskId, TaskName FROM Task";
            using (SqlCommand cmd = new SqlCommand(query))
            {
                cmd.Connection = con;
                con.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    while (sdr.Read())
                    {
                        items.Add(new SelectListItem
                        {
                            Text = sdr["TaskName"].ToString(),
                            Value = sdr["TaskId"].ToString()
                        });
                    }
                }
                con.Close();
            }
        }
        return items;
    }

这是我的看法:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@model WebApplication1.Models.TaskModel

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
</head>
<body>
    <div>    
        @using (Html.BeginForm("Index", "Home", FormMethod.Post))
        {
            <div class="form-group">
                @Html.DropDownListFor(m => m.TaskId, Model.Tasks, "--Select task--", null)
            </div>
            <button type="Submit" class="btn btn-success submit">Send</button><br/>
            <span style="color:green">@Html.Raw(ViewBag.Message)</span>
        }        
    </div>
</body>
</html>

这是我的模型:

namespace WebApplication1.Models
{
    public class TaskModel
    {
        public List<SelectListItem> Tasks { get; set; }
        public int TaskId { get; set; }
        public string TaskName { get; set; }
    }
}

问题是我在这里不断得到 null 而不是“TaskName”值,

ViewBag.Message = task.TaskName;

ViewBag.Message = task.TaskId;

正在正确处理,我可以在 ViewBag.Message 中看到它。我究竟做错了什么?

标签: asp.net-mvcrazor

解决方案


您的问题:在您的操作 POST 中,它仅从下拉列表中映射 TaskId,您需要在 TaskList 中进行过滤以检查列表中的选定任务。如果在列表中选择了任务,则设置ViewBag.Message = selectedTask.Text

您需要更新 POST 的操作代码:

[HttpPost]
 public ActionResult Index(TaskModel task)
 {
            task.Tasks = FillTaskList();
            var selectedTask = task.Tasks.FirstOrDefault(c => c.Value == task.TaskId.ToString());
            if (selectedTask != null)
            {
                ViewBag.Message = selectedTask.Text;
            }

            return View(task);
 }

推荐阅读