Любая идея, как это исправить, чтобы я не получил Javascript TypeError: правая часть 'in' должна быть объектом, есть строка - PullRequest
0 голосов
/ 16 октября 2019

Просмотр с двумя раскрывающимися списками, второй по умолчанию отключен. Когда выбор сделан в первом раскрывающемся списке, предполагается, что оба контроллера должны вызвать действие для получения списка значений для второго раскрывающегося списка, а затем использовать простой сценарий для очистки второго раскрывающегося списка, включить второй раскрывающийся списоки заполните его результатами.

Когда я делаю выбор из первого раскрывающегося списка, включается второй раскрывающийся список, но значения не отображаются. Используя Ctrl-shift-i, я вижу ошибку TypeError: правая часть 'in' должна быть объектом, есть строка.

Но я использую Список значений, а не строковую переменную ...

Я проверил в диспетчере SQL, что запрос SQL работает для всех трех различных опций, доступных в первом раскрывающемся меню.

Добавлено предупреждение (attValues);в $ .post. Это приводит к тому, что в документе отображается весь HTML-документ, который говорит о том, что страница 404 не найдена.

Важная строка выглядит так: <form method="post" action="../../../Error_404.aspx?selectedOption=SKU_SelectableAttribute_2" id="error404">

Контроллер

[HttpPost]
public ActionResult GetAttributeValues(string selectedOption)
{
   JsonResult result = new JsonResult();

   if (selectedOption != null)
   {
      string sql = "SELECT Title FROM BL_Attribute (NOLOCK) WHERE BL_Attribute.DeleteFlag = '0' AND AttributeGroupName = '" + selectedOption + "'";

      using (SqlCommand selectAttValues = new SqlCommand(sql, P21SqlConnection))
      {
         using (SqlDataReader reader = selectAttValues.ExecuteReader())
         {
             List<string> attValues = new List<string>();

             while (reader.Read())
             {
                attValues.Add(reader["Title"].ToString());
             }
             return Json(attValues, JsonRequestBehavior.AllowGet);
         }
      }

  }
  return Json(new { Success = "false" });
}

Просмотр

@using System.Data


@model Product

@{
    ViewBag.Title = "Attributes";
    Layout = "~/Views/Shared/_VisualRuleLayout.cshtml";

    var listAttGroups = new List<SelectListItem>
    {
        new SelectListItem { Text = "SKU_Color", Value = "SKU_Color"},
        new SelectListItem { Text = "SKU Select Att 1", Value = "SKU_SelectableAttribute_1"},
        new SelectListItem { Text = "SKU Select Att 2", Value = "SKU_SelectableAttribute_2"}
    };

}
@section scripts{
    <script>
        $(function () {
            $("#ApplyGroup").change(function () {

                var option = $(this).val();
                $("#AttributeValue").empty();
                $("#AttributeValue").prop('disabled', false);

                var url = "KCDA_PrdGrp_Attributes/GetAttributeValues?selectedOption=" + option;

                $.post(url, function (attValues) {
                    $.each(attValues, function (i, attValue) {
                        $("#AttributeValue").append($('<option></option>').val(attValue).html(attValue));
                    });
                });
            });
        });
    </script>
}

<center><h3>Edit Attributes</h3></center>

@using (Html.BeginForm("Return", "KCDA_PrdGrp_Attributes", FormMethod.Post, new { name = "Return" }))
{

   @Html.DropDownList("ApplyGroup", listAttGroups, new { @id = "ApplyGroup", @class = "form-control" })

   @Html.DropDownList("AttributeValue", new List<SelectListItem>(), new { @id = "AttributeValue", @class = "form-control", disabled = "disabled" })

}

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Ошибка - результат того, что возвращенный JSON является строкой. JSON, в конце концов, просто обозначение. Когда .each пытается выполнить итерацию массива, подобного переменной, вместо этого он находит строку и выдает ошибку.

Чтобы преобразовать строку в итерируемый массив, ее необходимо проанализировать. Также поможет проверка того, был ли ваш флаг успеха ложным.

$.post(url, function (attValues) {
    var result = JSON.parse(attValues);
    if( result.Success && result.Success == "false" ) return;
    $.each(result, function (i, attValue) {
        $("#AttributeValue").append($('<option></option>').val(attValue).html(attValue));
    });
});

Кроме того, SQL в контроллере проблематичен, так как не предотвращает вставку вредоносных значений в оперативный режим. запрос. Это должно быть решено путем параметризации, кодирования или использования другой парадигмы sql (такой как интеграция LINQ или использование ORM).

1 голос
/ 17 октября 2019

Таким образом, проблема оказалась простой по пути, ajax.post () по умолчанию уже использует текущий каталог, и я включил его в URL. Удаление «KCDA_PrdGrp_Attributes /» из начала исправленной проблемы с URL.

Также JSON.parse () был некорректным. Не удалось использовать .parse с ошибкой неверной символьной строки 1 символ 1 каждый раз после исправления URL-адреса, но без него он работает отлично.

Еще раз спасибо за помощь - идея ведения журнала Travis (в моем случае добавление простого предупреждения()), чтобы показать значение переменной действительно помогло мне закончить отладку.

$("#ApplyGroup").change(function () {

            var option = $(this).val();
            $("#AttributeValue").empty();
            $("#AttributeValue").prop('disabled', false);

            var url = "GetAttributeValues?selectedOption=" + option;

            $.post(url, function (attValues) {
                $.each(attValues, function (i, attValue) {
                    $("#AttributeValue").append($('<option></option>').val(attValue).html(attValue));
                });
            });
        });
...