C# 使用FormCollection发布下拉列表值/键
我有一个表单可以发布到一个动作:C# 使用FormCollection发布下拉列表值/键,c#,asp.net-mvc,razor,html.dropdownlistfor,formcollection,C#,Asp.net Mvc,Razor,Html.dropdownlistfor,Formcollection,我有一个表单可以发布到一个动作: public ActionResult Index() { CheckDataVM vm = new CheckDataVM(); vm.SerialNumbers = GetAllSerials(); vm.CustomerNames = GetAllCustomers(); vm.DateFrom = DateTime.Now.AddDays(-1); vm.DateT
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);
}
在我看来,我有一个帖子:
@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>
}
@使用(Html.BeginForm(“Index”,“CheckData”,FormMethod.Post,new{id=“SerialsForm”}))
{
@Html.DropDownListFor(x=>x.SelectedSerial,Model.SerialNumbers,新的{@class=“form control form control sm”})
}
视图模型为:
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; }
}
公共类CheckDataVM
{
公共字符串customerName{get;set;}
公共字符串SelectedSerial{get;set;}
[显示(Name=“选择序列号”)]
公共IEnumerable序列号{get;set;}
}
下拉列表可以工作,但是当我提交表单时,我得到的唯一结果是对象名(SerialNumbers)作为键
我希望能够从下拉列表中获取所选项目,并将其传递给Index操作的Httpost中的FormCollection。为了我的生命,我不能让它工作
我希望看到一个名为“CustomersDdl”的键及其值。例如,如果我有一个国家的下拉列表,我选择了英格兰,我希望看到一个值返回到FormCollection中,称为England
我做错了什么?回发的值取决于创建“SelectListItem”的方式,在您的情况下,它位于方法“GetAllSerials()”中
要将下拉文本发送到服务器,您可以使用隐藏字段,在jQuery中使用下拉文本提交表单之前需要设置该字段,然后使用隐藏字段名向POST操作添加额外参数。请检查这一点,为什么您要使用
FormCollection
而不是绑定到您的模型?但问题是不能将
绑定到复杂对象的集合(这就是SerialNumbers
的含义)。您的模型需要一个属性来绑定(例如)int-SelectedSerialNumber
,然后是它的@Html.DropDownListFor(x=>x.SelectedSerialNumber,model.SerialNumbers,…)
(并删除无意义的@name=“CustomersDdl”
,幸运的是它不会更改名称
属性),谢谢你让我走上正轨。我现在绑定到VM并编辑了上面的代码。虽然我得到的是索引,而不是文本。我已经在选择列表中设置了文本选项。在这种情况下,您只能取回索引,因为我只想取回文本……您没有显示如何生成IEnumerable
,但是值
属性将被发回(我假设您将值
属性设置为数值,而不是您想要的文本)我通过将文本和值设置为SerialNumber来获取文本。我不需要索引,所以我可以假设这是可以的吗?实际上,您可以将相同的值设置为“Text”和“value”vm.SerialNumbers=SerialNumbers.Select(serial=>new-SelectListItem{Selected=serial.Name==vm.SelectedSerial?true:false,Text=serial.Name,value=serial.Name})。ToList();因此您将获得文本而不是“Id”。
vm.SerialNumbers = serialNumbers.Select(serial => new SelectListItem
{
Selected = serial.id == vm.SelectedSerial ? true : false,
Text = serial.Name,
Value = serial.Name
}).ToList();