我在使用MVC中的htmlhelper下拉列表时遇到问题。发布回发时,没有选择任何内容,模型中列表和所选项目的值为空。
以下是我的模特:
namespace MvcTestWebApp.Models
{
public class Customer
{
public string name { get; set; }
public List<SelectListItem> members { get; set; }
public Member selected { get; set; }
}
public class Member
{
public string name { get; set; }
}
}
控制器:
namespace MvcTestWebApp.Models
{
public class CustomerController : Controller
{
//
// GET: /Customer/
public ActionResult Index()
{
Customer cust = new Customer() { name = "Cust1" };
cust.members = new List<SelectListItem>();
cust.members.Add(new SelectListItem(){Text = "Bob"} );
cust.members.Add(new SelectListItem(){Text = "Dave"} );
return View(cust);
}
[HttpPost]
public ActionResult Index(Customer customer)
{
return View();
}
}
}
观看:
@model MvcTestWebApp.Models.Customer
@{
ViewBag.Title = "Customer";
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title> Index </title>
</head>
<body>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Customer Data</legend>
@Html.HiddenFor(model => model.name)
@Html.DropDownListFor(model => model.selected, Model.members, "--Select--")
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
</body>
</html>
当我从选择列表中选择某些内容并单击提交按钮时,将返回空值:
有人能说清楚我做错了吗?
答案 0 :(得分:21)
您遇到的问题是MVC不知道如何将下拉列表的选定值(字符串)转换为对象成员。
您应该做的是使用selectedValue属性,该属性用于设置下拉列表中的值并检索返回的值。
新客户类:
public class Customer
{
public string name { get; set; }
public List<SelectListItem> members { get; set; }
public string selectedValue { get; set; }
public Member selected { get; set; }
}
更新了下拉列表控件:
@Html.DropDownListFor(model => model.selectedValue, Model.members, "--Select--")
这会将选定的值从下拉列表返回到属性selectedValue。
您的成员列表返回null的原因是HTML不返回下拉列表中的选项,它只返回选定的值。因此,当信息进入方法时,只给出输入表单的值。
如果您想查看哪些信息被发送回服务器,您可以使用开发者控制台并捕获返回的Http请求
和/或
您可以将FormCollection collection
添加到控制器操作的参数中,以查看MVC用于构建传递给方法的对象的信息。
[HttpPost]
public ActionResult Index(Customer customer, FormCollection collection)
{
return View();
}
答案 1 :(得分:0)
cust.members.Add(new SelectListItem(){Text = "Bob"} );
cust.members.Add(new SelectListItem(){Text = "Dave"} );
尝试设置值:
cust.members.Add(new SelectListItem(){Value = "Bob", Text = "Bob"} );
cust.members.Add(new SelectListItem(){Value = "Dave", Text = "Dave"} );
答案 2 :(得分:-3)
使用jQuery prepend轻松解决问题。
$("#idOfSelectTag").prepend('
<option selected="selected" value="null">
-- Select School --
</option>
');