我是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中看到它。我究竟做错了什么?
您的问题:在您的操作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);
}
使用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;