【问题标题】:DropDownList with java script使用 JavaScript 的下拉列表
【发布时间】:2018-07-25 19:01:33
【问题描述】:

希望开发者多多支持,我对java script的使用经验很少。

经过调查和多次尝试,我能够从 LINQ 查询中加载包含数据的下拉列表,并将文本框的值作为参数传递。

我不能做的是从查询 Linq 获取两个字段(Id 和 value)将它们发送到下拉列表并显示值,但是在能够使用该字段的 Id 之后能够在创建中使用它,目前我只能显示值,但我也需要 Id。

查看

@Html.TextBox("CP", "", new { @id = "txtCP", @onchange = "FillOption();", @placeholder = "Codigo Postal" })
@Html.DropDownList("Asentamientos", ViewBag.Drop as List<SelectListItem>)

脚本

<script>
    function FillOption() {
        var CP = $('#txtCP').val();
        $.ajax({
            type: "Post",
            url: "/Home/GetAsentamiento",
            data: { CP: CP },
            dataType: 'json',
            success: function (data) {
                $("#Asentamientos").empty();
                for (var i = 0; i < data.length; i++) {
                    $('#Asentamientos').append('<option value=' + data[i].Value + '>' + data[i].Text + '</option > ');
                }
            }
        });
    }
</script>

控制器

 public ActionResult Index()
        {
            List<SelectListItem> drop = new List<SelectListItem>
            {
            };
            ViewBag.Drop = drop;
            return View();

        }

        [HttpPost]
        public ActionResult GetAsentamiento(string CP)
        {
            var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select p.Asentamiento).ToList();
            SelectList lista = new SelectList(drop2);
            ViewBag.lista = lista;
            return Json(ViewBag.lista);
        }

我想到了类似的东西

 [HttpPost]
        public ActionResult GetAsentamiento(string CP)
        {
            var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select new { p.IdCodigoPostal,p.Asentamiento}).ToList();
            SelectList lista = new SelectList(drop2);
            ViewBag.lista = lista;
            return Json(ViewBag.lista);
        }

但我不知道 id 和 value 将如何处理

谢谢

【问题讨论】:

    标签: javascript c# asp.net-mvc drop-down-menu


    【解决方案1】:

    如果我正确理解您的问题,我认为您需要使用 Linq 表达式命名您正在创建的对象的字段,使其看起来像这样:

    [HttpPost]
        public ActionResult GetAsentamiento(string CP)
        {
            var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select new { id = p.IdCodigoPostal, value = p.Asentamiento}).ToList();
            SelectList lista = new SelectList(drop2);
            ViewBag.lista = lista;
            return Json(ViewBag.lista);
        }
    

    这里有几个例子:https://code.msdn.microsoft.com/LINQ-to-DataSets-09787825#SelectAnonymousTypes1

    然后您可以使用 data[i].iddata[i].value 从您的 javascript 访问这些字段。 我希望这会有所帮助。

    【讨论】:

    • 我正在尝试解决方案,但是当我将它放在下拉列表中时,它会绘制整个文本字符串 {id= 1, value = Loc} 如果我使用 data[i].id 和 data脚本中的 [i].value 将值发送给我“未定义”
    • 好的。澄清一下,您现在使用的是 ' '。很抱歉那里的命名,也许它会更好地调用'value' asentamiento 或其他东西
    • 对不起,经过一番研究后,我发现我误解了一些关于 SelectList 和 ViewBag 的内容。为了使它起作用,您可能必须像@Phil Golding 建议的那样只返回 drop2 列表
    • 感谢您的帮助,我更改了名称 ti data[i].id 和 data[i].value 或 data[i].asent(也在控制器中更改)但如果我不使用data[i].Text 结果未定义。
    【解决方案2】:

    我怀疑您的问题与从 API 结果中提取数据有关。您正在 ViewBag 中设置新属性,然后返回 ViewBag 属性。这确实不是必需的,您应该只返回您的列表,列出这样(注意:并且 SelectItemList 有一个名为“Items”的属性,其中包含您添加的所有项目):

     [HttpPost]
            public ActionResult GetAsentamiento(string CP)
            {
                var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select new { p.IdCodigoPostal,p.Asentamiento}).ToList();
                SelectList lista = new SelectList(drop2);
                return Json(lista.Items);
            }
    

    这应该只返回一个很好的 ListItems 列表。你也可以改变你的 jQuery 来循环遍历 items 属性,像这样:

    <script>
        function FillOption() {
            var CP = $('#txtCP').val();
            $.ajax({
                type: "Post",
                url: "/Home/GetAsentamiento",
                data: { CP: CP },
                dataType: 'json',
                success: function (data) {
                    $("#Asentamientos").empty();
                    for (var i = 0; i < data.Items.length; i++) {
                        $('#Asentamientos').append('<option value=' + data.Items[i].Value + '>' + data.Items[i].Text + '</option > ');
                    }
                }
            });
        }
    </script>
    

    【讨论】:

    • 还值得注意的是,我不完全同意返回这样的列表项 - 就个人而言,您应该有一个映射到数据层类的类,并返回一个列表,而不是比选择列表项。然后由您的前端应用程序对数据做它想做的事情。
    • 使用这种方式,我得到了控制器中的值列表,但在视图中脚本不显示值,不填充下拉列表。
    • 你选择了哪个选项?在控制器中返回 Items 属性,还是在 JS 中访问 Items 属性?
    • 在控制器中返回 Items 属性对我有用,只需进行一些更改。在 Query 中添加属性 Value 和 Text。
    【解决方案3】:

    感谢大家,代码如下

    控制器

     [HttpPost]
        public ActionResult GetAsentamiento(string CP)
        {
            var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select new { Value = p.IdCodigoPostal, Text= p.Asentamiento }).ToList();
            SelectList lista = new SelectList(drop2);
            return Json(lista.Items);
        }
    

    脚本

    <script>
    function FillOption() {
        var CP = $('#txtCP').val();
        $.ajax({
            type: "Post",
            url: "/Home/GetAsentamiento",
            data: { CP: CP },
            dataType: 'json',
            success: function (data) {
                $("#Asentamientos").empty();
                for (var i = 0; i < data.length; i++) {
                    $('#Asentamientos').append('<option value=' + data[i].Value + '>' + data[i].Text + '</option > ');
                }
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多