fshirt09 Ответов: 1

Как я могу сделать возврат привязки на возвращение в JSON listboxfor к действию?


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

Если пользователь устанавливает флажок, вызов jquery выполняется к действию контроллера для запроса списка, чтобы получить дочерние элементы и вернуть соответствующий список через JSON в список совместного ответа.

Это все прекрасно работает! Вопрос только в привязке.

Вот действие JSON, которое возвращает дочерние объекты:

[HttpGet]
       public ActionResult PickupKids(int id)
       {
           AccountFormEntities db = new AccountFormEntities();
           var childItems = (from c in db.account_type_children
                             where c.groupID.Equals(id)
                             select c
                             ).OrderBy(c => c.title)
                             .ToList();

           List<SelectListItem> SelectedAccountChildren = new List<SelectListItem>();

           foreach (var item in childItems)
           {
               SelectListItem selectListItem = new SelectListItem();
               selectListItem.Text = item.title;
               selectListItem.Value = item.id.ToString();
               selectListItem.Selected = item.selected;
               SelectedAccountChildren.Add(selectListItem);


           }
           return Json(SelectedAccountChildren, JsonRequestBehavior.AllowGet);

       }


который возвращается к этому событию Jquery для заполнения списка:

//ValidateChecks();
          if ($(this).prop('checked'))//---------------------magic show goes here

          {
              $('.' + checkId).css("color", "black");
              $('.' + checkId).css("font-weight", "Bold");

              $('.' + checkId).css("font-size", "large");
              //$(divId).toggle("bounce", { times: 3 }, "slow");
              $(divId).show(1000);//show the box
           //---AJAX/JSON

              var url = '@Url.Action("PickupKids")';

              $.ajax({
                  url: url,
                  type: 'GET',
                  cache: false,
                  data: { id: checkId },
                  dataType: "json",
                  contentType: 'application/json; charset=utf-8',
                  success: function (json) {

                      $('.' + ListID).empty();
                     // $('.' + checkId).css("color", "gray");


                      $.each(json, function (index, optiondata) {
                          $('.' + ListID).append("<option value='" + optiondata.Value + "'>" + optiondata.Text + "</option>");
                      });

                  }
              });




Затем список (который действительно правильно заполняется правильными дочерними элементами:


@if (Model.AccountTypes[i].Account_type_options == "BDMS")
             {

              @Html.ListBoxFor(x => x.AccountTypeChildren, Model.SelectedAccountChildren, new { @class = SelectGroupId, @style = "height:150px; width:500px" })
             }



вот определения ViewModel для двух объектов модели в списке:

public List<SelectListItem> AccountTypeChildren //list of all children objects
     {
         get;
         set;
     }


public List<SelectListItem> SelectedAccountTypeChildren //list of all children objects
     {
         get;
         set;
     }


и то, что возвращается, - это выбранные идентификаторы, но он возвращает их каждый как экземпляр 'selectedAccountTypeChildren' (пример: selectedAccountTypeChildren = 10, selectedAccountTypeChildren=13), где он должен читать 'selectedaccounttypechildren[110] value=true' и т. д.

Кто-нибудь знает, как правильно привязать список? Спасибо за любую информацию

Что я уже пробовал:

Я пробовал изменять типы списков и пытаться повторять списки, но список оказывается нулевым в действии, но в fiddler он действительно показывает:

Body                                    value
AccountTypes[4].Account_type_options	INB
SelectedAccountTypeChildren	        111
SelectedAccountTypeChildren	        112

Laxmidhar tatwa technologies

это ваш код, когда заливка из ajax не использует модель.SelectedAccountChildren
@Html.ListBoxFor(x => x.AccountTypeChildren, модель.SelectedAccountChildren, новые { @класс = SelectGroupId, @стиль = "высота:150 пикселей; ширина:500 пикселей" })


insed модели.SelectedAccountChildren использует нижеприведенный вариант


@Html.ListBoxFor("child", new SelectList(string.Пустые, "значение", "текст"), "--выберите-- ребенок", новые { @класс = "форма контроля", @идентификатор = "ddlcity",@свойство tabindex="13" })

fshirt09

Интересно - я попробую это сейчас, спасибо за ответ, ввод.

fshirt09

Я думаю, что это выглядит хорошим направлением, имеет смысл сначала опустошить объект. Я получаю ошибку "no overload for listbox takes 4 arguments", работая над тем, чтобы привести предоставленный ответ в правильное соответствие аргументов прямо сейчас. Я знаю, что это звучит нубовски, но я вроде как нуб в MVC. Я ценю ваше время, вклад и терпение.

1 Ответов

Рейтинг:
2

fshirt09

Я пошел с formcollection и просто пробежал через коллекцию, чтобы получить свой идентификатор, а затем запустил запрос Entity F, чтобы получить информацию о совместном ответе из БД на основе возвращенных ключей для элемента. Надеюсь, это поможет кому-то в будущем.


Если у кого-то есть идея получше, я с удовольствием ее выслушаю. Но formcollection действительно работает, хотя и немного неуклюже:

foreach (string key in formStuff.AllKeys)
                      {
                          if (key.Contains("SelectedAccountTypeChildren"))
                          {
                              var kids = formStuff.GetValues(key);
                              foreach (var item in kids)
                              {//for all the selected child items, query the data and pair to the 'groupId' from parent (accountType)
                               //select all the child items where groupid from the id = = the childgroup var

                                  var childName = from k in AFEntities.account_type_children where k.groupID.Equals(childGroup) select k.title;


                              }
                          }