无法正确访问值下拉列表ASP MVC

时间:2019-02-22 19:03:55

标签: asp.net-mvc razor

我是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; }
    }
}

问题是我一直在这里获取空值而不是“ TaskName”值,

ViewBag.Message = task.TaskName;

但是

ViewBag.Message = task.TaskId;

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

2 个答案:

答案 0 :(得分:1)

您的问题:在操作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);
 }

答案 1 :(得分:0)

使用Html.HiddenFor Helper方法以该属性的形式创建一个隐藏变量

@Html.HiddenFor(x => x.TaskName)

使用javascript设置所选文本

$(function () {
  $("form").submit(function(){
    var selText = $("#TaskId option:selected").text();
    $("#TaskName").val(selText);           
  });
});

然后在控制器中即可获取

string value = model.TaskName;