【问题标题】:Post Dropdown values/keys using FormCollection使用 FormCollection 发布下拉值/键
【发布时间】: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而不是绑定到你的模型?但是您的问题是您不能将&lt;select&gt; 绑定到复杂对象的集合(这就是SerialNumbers 的含义)。你的模型需要一个属性来绑定(比如说)int SelectedSerialNumber,然后是它的@Html.DropDownListFor(x =&gt; x.SelectedSerialNumber, Model.SerialNumbers, ...)(并删除毫无意义的@name = "CustomersDdl",幸运的是它不会改变name属性`)
  • 嗨,斯蒂芬,感谢您让我走上正轨。我现在绑定到 VM 并在上面编辑了代码。虽然我得到的是索引而不是文本。我已经在选择列表中设置了文本选项。是不是只能取回索引,因为我只想取回文本...
  • 您尚未展示如何生成IEnumerable&lt;SelectListItem&gt;,但Value 属性将被回发(我假设您将Value 属性设置为数值,而不是你想要的文字)

标签: c# asp.net-mvc razor html.dropdownlistfor formcollection


【解决方案1】:

回发的值取决于您创建“SelectListItem”的方式,在您的情况下,它在方法“GetAllSerials()”中

  vm.SerialNumbers = serialNumbers.Select(serial => new SelectListItem
        {
            Selected = serial.id == vm.SelectedSerial ? true : false,
            Text = serial.Name,
            Value = serial.Name
        }).ToList();

【讨论】:

  • 我通过将文本和值设置为序列号来取回文本。我不需要索引,所以我可以假设没问题吗?
  • 其实你可以为“Text”和“Value”设置相同的值 vm.SerialNumbers = serialNumbers.Select(serial => new SelectListItem { Selected = serial.Name == vm.SelectedSerial ? true : false, Text = serial.Name, Value = serial.Name }).ToList();所以你会得到文本而不是“Id”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 2021-05-22
  • 2013-06-13
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多