【发布时间】:2018-09-13 13:33:11
【问题描述】:
我有一个发布到操作的表单:
public ActionResult Index()
{
CheckDataVM vm = new CheckDataVM();
vm.SerialNumbers = GetAllSerials();
vm.CustomerNames = GetAllCustomers();
vm.DateFrom = DateTime.Now.AddDays(-1);
vm.DateTo = DateTime.Now;
return View(vm);
}
[HttpPost]
public ActionResult Index(CheckDataVM v)
{
CheckDataVM vm = new CheckDataVM();
vm.SerialNumbers = GetAllSerials();
var s = vm.SerialNumbers.First().Text.ToString();
vm.Channels = GetAllChannels(s);
vm.DateFrom = DateTime.Now.AddDays(-1);
vm.DateTo = DateTime.Now;
return View(vm);
}
在我的 Razor 视图中,我有帖子:
@using (Html.BeginForm("Index", "CheckData", FormMethod.Post, new { id = "SerialsForm" }))
{
<div class="card-body" style="font-size: small;">
<div class="form-group">
@Html.DropDownListFor(x => x.SelectedSerial, Model.SerialNumbers, new { @class = "form-control form-control-sm" })
<input type="submit" value="Submit" />
</div>
</div>
}
视图模型是:
public class CheckDataVM
{
public string CustomersName { get; set; }
public string SelectedSerial { get;set; }
[Display(Name="Select a serial number")]
public IEnumerable<SelectListItem> SerialNumbers { get; set; }
}
下拉菜单有效,但是当我提交表单时,我得到的唯一信息是对象名称 (SerialNumbers) 作为键。
我希望能够从下拉列表中获取所选项目并将其传递给 Index 操作的 Httpost 中的 FormCollection。为了我的生活,我无法让它工作!
我希望看到一个名为“CustomersDdl”的键和它的值。例如,如果我有一个充满国家/地区的下拉菜单,然后我选择了英格兰,我希望在 FormCollection 中看到一个值,即英格兰。
我做错了什么?
【问题讨论】:
-
要将下拉文本发送到服务器,您可以使用隐藏字段,您需要在 jQuery 中使用下拉文本提交表单之前设置该隐藏字段,然后使用隐藏字段名称向您的 POST 操作添加额外参数。检查这个stackoverflow.com/questions/20930221/…
-
为什么你使用
FormCollection而不是绑定到你的模型?但是您的问题是您不能将<select>绑定到复杂对象的集合(这就是SerialNumbers的含义)。你的模型需要一个属性来绑定(比如说)int SelectedSerialNumber,然后是它的@Html.DropDownListFor(x => x.SelectedSerialNumber, Model.SerialNumbers, ...)(并删除毫无意义的@name = "CustomersDdl",幸运的是它不会改变name属性`) -
嗨,斯蒂芬,感谢您让我走上正轨。我现在绑定到 VM 并在上面编辑了代码。虽然我得到的是索引而不是文本。我已经在选择列表中设置了文本选项。是不是只能取回索引,因为我只想取回文本...
-
您尚未展示如何生成
IEnumerable<SelectListItem>,但Value属性将被回发(我假设您将Value属性设置为数值,而不是你想要的文字)
标签: c# asp.net-mvc razor html.dropdownlistfor formcollection