Создать список вариантов выбора в JavaScript после получения данных JSON из контроллера - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть список в контроллере (MVC)

public CompanyController() {
         _company = new List<CompanyModel>{
            new CompanyModel{Name="A 1", Email="a1@company.com", Group="Group1"},
            new CompanyModel{Name="A 2", Email="a2@company.com", Group="Group2"},
            new CompanyModel{Name="A 3", Email="a3@company.com", Group="Group3"},
            new CompanyModel{Name="B 1", Email="b1@company.com", Group="Group1"},
            new CompanyModel{Name="C 1", Email="c1@company.com", Group="Group2"},
            new CompanyModel{Name="D 1", Email="d1@company.com", Group="Group4"},
            new CompanyModel{Name="E 1", Email="e1@company.com", Group="Group5"},
            new CompanyModel{Name="E 2", Email="e2@company.com", Group="Group6"},
            new CompanyModel{Name="F 1", Email="f1@company.com", Group="Group6"},
            new CompanyModel{Name="G 1", Email="b1@company.com", Group="Group5"},
            new CompanyModel{Name="H 1", Email="b1@company.com", Group="Group6"},
            new CompanyModel{Name="I 1", Email="b1@company.com", Group="Group3"},
            new CompanyModel{Name="J 1", Email="b1@company.com", Group="Group7"},
            new CompanyModel{Name="K 1", Email="b1@company.com", Group="Group6"},
            new CompanyModel{Name="L 1", Email="b1@company.com", Group="Group1"},
            new CompanyModel{Name="M 1", Email="b1@company.com", Group="Group2"},
            new CompanyModel{Name="N 1", Email="b1@company.com", Group="Group2"},
            new CompanyModel{Name="O 1", Email="b1@company.com", Group="Group4"},
            new CompanyModel{Name="P 1", Email="b1@company.com", Group="Group5"},            
            new CompanyModel{Name="R 1", Email="b1@company.com", Group="Group5"},
            new CompanyModel{Name="S 1", Email="b1@company.com", Group="Group8"},
            new CompanyModel{Name="T 1", Email="b1@company.com", Group="Group8"},
            new CompanyModel{Name="U 1", Email="b1@company.com", Group="Group1"},
            new CompanyModel{Name="V 1", Email="b1@company.com", Group="Group2"},
            new CompanyModel{Name="X 1", Email="b1@company.com", Group="Group4"},
            new CompanyModel{Name="Y 1", Email="b1@company.com", Group="Group3"},
            new CompanyModel{Name="Z 1", Email="b1@company.com", Group="Group3"},
            new CompanyModel{Name="W 1", Email="b1@company.com", Group="Group6"},
         };
      }

который я отправил через JSON в JQuery как:

objectCompany = null;
data = "";

$.ajax({
         url: '/Company/List',
         dataType: 'json',
         contentType: 'application/json; charset=utf-8',
         success: function (msg) {
            data = msg;
         },
         complete: function () {
            objectCompany = data;
         }
      });

Я хочу добавить к своему тегу select <select name="filters" id="filters"></select> все параметры, значения которых Group, без повторения аналогичных значений.

UPDATE

if (objectCompany != null) {
     $("#filters").empty();
     $("#filters").html("<option value='all' selected='selected'>All groups</option>");
     var arrayUnique = [];
     for (var i = 0; i < objectCompany .length; i++) {
        for (var j = i + 1; j < objectCompany .length; j++) {
           if (objectCompany [i].Group === objectCompany [j].Group) {
              j = ++i;
           }
        }
        arrayUnique.push(objectCompany [i].Group);
     }

     arrayUnique = arrayUnique.sort();

     $.each(arrayUnique, function (k, v) {
        $("#filters").append("<option value='" + v + "'>" + v + "</option>");
     });
      }

Обновление: теперь работает:)

1 Ответ

1 голос
/ 29 декабря 2011

Зачем бороться с JavaScript?Почему вы не используете модель представления?Почему бы вам не подготовить данные из действия вашего контроллера, чтобы все, что нужно сделать представлению, это отобразить его?Зачем тратить свою пропускную способность на несколько повторяющихся групп в JSON?

public ActionResult List()
{
    var model = _company.Select(x => x.Group).Distinct();
    return Json(model, JsonRequestBehavior.AllowGet);
}

Теперь все просто:

var filters = $('#filters');
filters.empty();
filters.append(
    $('<option/>', {
        value: 'all',
        selected: 'selected',
        text: 'All groups'
    })
);
$.each(objectCompany, function (index, group) {
    filters.append(
        $('<option/>', {
            value: group,
            text: group
        })
    );
});

ОБНОВЛЕНИЕ:

Если выЕсли вы хотите выполнить эту фильтрацию на стороне клиента, вы можете определить функцию, которая будет получать различные элементы:

$.extend({
    distinct : function(arr, selector) {
       var result = [];
       $.each(arr, function(index, value) {
           var item = selector(value);
           if ($.inArray(item, result) == -1) {
               result.push(item);
           }
       });
       return result;
    }
});

, а затем:

var filters = $('#filters');
filters.empty();
filters.append(
    $('<option/>', {
        value: 'all',
        selected: 'selected',
        text: 'All groups'
    })
);
var groups = $.distinct(objectCompany, function(item) { return item.Group; });

$.each(groups, function (index, group) {
    filters.append(
        $('<option/>', {
            value: group,
            text: group
        })
    );
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...