Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用FormCollection发布下拉列表值/键_C#_Asp.net Mvc_Razor_Html.dropdownlistfor_Formcollection - Fatal编程技术网

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();