【问题标题】:Can't access value correctly drop down list asp mvc无法正确访问值下拉列表 asp mvc
【发布时间】:2019-02-22 19:03:55
【问题描述】:

我是 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 中看到它。我做错了什么?

【问题讨论】:

  • 使用浏览器控制台或 Fiddler 或类似工具查看发布的有效负载。我希望您会发现TaskId(来自下拉菜单)是有效负载中的唯一属性,或者至少是有效负载中唯一具有值的属性。 ASP.NET 模型绑定最好将 POSTed 值映射到您指定的类型——但它没有任何过去的状态。如果您考虑一下您的用例,TaskId 是唯一需要回发的值。您应该使用回传的 ID 来查询该 TaskId 的最新值(包括 TaskName)。
  • 看来真的是这样,谢谢指教!
  • 我的荣幸。欢迎来到 StackOverflow -- #SOReadyToHelp

标签: asp.net-mvc razor


【解决方案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);
 }

【讨论】:

    【解决方案2】:

    使用 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;
    

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多