DropDownList со скриптом Java

1

Я надеюсь, что разработчики могут поддержать меня, у меня есть минимальный опыт использования java-скрипта.

После исследования и нескольких попыток я смог загрузить выпадающий список с данными из запроса LINQ и передать в качестве параметра значение текстового поля.

То, что я не мог сделать, - это выполнить запрос Linq, чтобы получить два поля (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);
        }

но я не знаю, как будет обрабатываться идентификатор и значение

Спасибо

Теги:
asp.net-mvc
drop-down-menu

3 ответа

2

Я подозреваю, что ваша проблема связана с извлечением данных из результата API. Вы устанавливаете новое свойство в ViewBag, а затем возвращаете свойство ViewBag. Это действительно не требуется, и вместо этого вы должны просто вернуть список, перечислите его так: (Примечание: и SelectItemList имеет свойство "Элементы", которое содержит все элементы, которые вы добавили):

 [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>
  • 1
    Также стоит отметить, что я не совсем согласен с возвратом таких элементов списка - лично у вас должен быть класс, который сопоставляется с классом слоя данных, и возвращать его список, а не SelectListItems. Затем ваше приложение должно сделать то, что он хочет с данными.
  • 0
    Используя этот способ, я получаю список со значениями в контроллере, но в представлении сценарий не показывает значения, не заполняет раскрывающийся список.
Показать ещё 2 комментария
2

Если я правильно понял ваш вопрос, я думаю, вам нужно называть поля объекта, который вы создаете, с выражением 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

Затем вы можете получить доступ к этим полям из javascript с data[i].id и data[i].value. Надеюсь, это поможет.

  • 0
    Я пытаюсь найти решение, однако, когда я помещаю его в выпадающий список, он рисует всю текстовую строку, {id = 1, value = Loc}, если я использую data [i] .id и data [i] .value в сценарии. пришлите мне "undefined" en значение
  • 0
    Хорошо. Просто чтобы уточнить, используете ли вы сейчас <option value = '+ data [i] .id +'> '+ data [i] .value +' </ option> '. Извините за наименование там, может быть, было бы лучше назвать «значение» Asentamiento или что-то
Показать ещё 2 комментария
0

Благодаря коду, код работает следующим образом

контроллер

 [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 > ');
            }
        }
    });
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню