2011-12-29 42 views
0

recevinig JSON數據後,我在控制器(MVC)的列表產生的JavaScript選擇列表的選項從控制器

public CompanyController() { 
     _company = new List<CompanyModel>{ 
      new CompanyModel{Name="A 1", Email="[email protected]", Group="Group1"}, 
      new CompanyModel{Name="A 2", Email="[email protected]", Group="Group2"}, 
      new CompanyModel{Name="A 3", Email="[email protected]", Group="Group3"}, 
      new CompanyModel{Name="B 1", Email="[email protected]", Group="Group1"}, 
      new CompanyModel{Name="C 1", Email="[email protected]", Group="Group2"}, 
      new CompanyModel{Name="D 1", Email="[email protected]", Group="Group4"}, 
      new CompanyModel{Name="E 1", Email="[email protected]", Group="Group5"}, 
      new CompanyModel{Name="E 2", Email="[email protected]", Group="Group6"}, 
      new CompanyModel{Name="F 1", Email="[email protected]", Group="Group6"}, 
      new CompanyModel{Name="G 1", Email="[email protected]", Group="Group5"}, 
      new CompanyModel{Name="H 1", Email="[email protected]", Group="Group6"}, 
      new CompanyModel{Name="I 1", Email="[email protected]", Group="Group3"}, 
      new CompanyModel{Name="J 1", Email="[email protected]", Group="Group7"}, 
      new CompanyModel{Name="K 1", Email="[email protected]", Group="Group6"}, 
      new CompanyModel{Name="L 1", Email="[email protected]", Group="Group1"}, 
      new CompanyModel{Name="M 1", Email="[email protected]", Group="Group2"}, 
      new CompanyModel{Name="N 1", Email="[email protected]", Group="Group2"}, 
      new CompanyModel{Name="O 1", Email="[email protected]", Group="Group4"}, 
      new CompanyModel{Name="P 1", Email="[email protected]", Group="Group5"},    
      new CompanyModel{Name="R 1", Email="[email protected]", Group="Group5"}, 
      new CompanyModel{Name="S 1", Email="[email protected]", Group="Group8"}, 
      new CompanyModel{Name="T 1", Email="[email protected]", Group="Group8"}, 
      new CompanyModel{Name="U 1", Email="[email protected]", Group="Group1"}, 
      new CompanyModel{Name="V 1", Email="[email protected]", Group="Group2"}, 
      new CompanyModel{Name="X 1", Email="[email protected]", Group="Group4"}, 
      new CompanyModel{Name="Y 1", Email="[email protected]", Group="Group3"}, 
      new CompanyModel{Name="Z 1", Email="[email protected]", Group="Group3"}, 
      new CompanyModel{Name="W 1", Email="[email protected]", 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

爲什麼用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 
     }) 
    ); 
}); 

UPDATE:

如果你想要做的客戶端上的這種過濾可以定義一個函數,它會得到不同的元素:

$.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; 
    } 
}); 

a那麼:

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 
     }) 
    ); 
}); 
+0

因爲'objectCompany'將在JS的其他函數中重用,這就是爲什麼我發送了所有數據。我只想在JS中操作數據,我想避免將數據發送到服務器並取回響應。這個對象將是巨大的,我在這裏寫了一部分。 –

+0

@MichaelSwan,然後寫另一個控制器動作。專門爲此AJAX調用而設計。我還更新了我的答案,以說明在客戶端選擇不同元素的示例,但我不推薦這種方法。 –

+0

看到我更新的代碼(用JS編寫的最後一個代碼)..現在它的工作原理:)沒有調用和/或創建另一個控制器 –