2011-09-12 67 views
2

最近幾天我試圖讓jqgrid自動完成字段工作,現在我可以使它與本地數據一起工作,但只要我試圖從我的數據中獲取數據控制器數據不會被解析。JqGrid with autocompletion cant解​​析控制器查看數據

查看代碼:

  { name: 'EanNummer', index: 'EanNummer', width: 65, sortable: true, editable: true, edittype: 'text', editoptions: { 
       dataInit: 
      function (elem) { 
       $(elem).autocomplete({ minLength: 0, source: '@Url.Action("GetBrands")' }) 
       .data("autocomplete")._renderItem = function (ul, item) { 
        return $("<li></li>") 
      .data("item.autocomplete", item) 
      .append("<a>" + item.Id + ", " + item.Name + "</a>") 
      .appendTo(ul); 
       }; 
      } 
      } 
      }, 

如果不是源:URL我使用源:[ 「C++」, 「Java」 的, 「PHP」, 「ColdFusion的」, 「JavaScript的」, 「ASP」,「紅寶石「例如代碼工作正常,並顯示出來,所以一定出事了與我的控制器端代碼

控制器代碼:如果您在客戶端SID使用item.Iditem.Name

public JsonResult GetBrands() 
    { 

     string vendorId = ""; 
     var username = ""; 
     var name = System.Web.HttpContext.Current.User.Identity.Name; 
     var charArray = name.Split("\\".ToCharArray()); 
     username = charArray.Last(); 
     vendorId = service.GetVendorIdByUsername(username); 

     List<String> list = new List<String>(); 
     var brands = service.getBrandsByVendor(vendorId); 

     var s= (from brand in brands 
        select new 
        { 
         Id = brand.BrandId, 
         Name = brand.BrandName 

        }).ToList(); 

     return Json(s); 
    } 

回答

6

é你應該返回不是List<String>。而不是你應該返回的列表new {Id=brand.BrandId, Name=brand.BrandName}。你應該只使用LINQ,而不是foreach

return Json ((from brand in brands 
       select new { 
        Id = brand.BrandId, 
        Name = brand.BrandName 
       }).ToList()); 

修訂:我修改爲您演示從the answer,其中包括兩種形式jQuery UI的自動完成功能的支持。標準呈現:

enter image description here

和自定義呈現:

enter image description here

自動填充功能,工作在Advanced Searching對話框以同樣的方式就像在Searching Toolbar

enter image description here

您可以從here下載演示。

標準自動完成的服務器代碼是

public JsonResult GetTitleAutocomplete (string term) { 
    var context = new HaackOverflowEntities(); 
    return Json ((from item in context.Questions 
        where item.Title.Contains (term) 
        select item.Title).ToList(), 
       JsonRequestBehavior.AllowGet); 
} 

它返回字符串數組JSON格式。標題列表由term參數過濾,該參數將被初始化爲在輸入字段中鍵入的字符串。

自定義自動完成的服務器代碼是

public JsonResult GetIds (string term) { 
    var context = new HaackOverflowEntities(); 
    return Json ((from item in context.Questions 
        where SqlFunctions.StringConvert((decimal ?)item.Id).Contains(term) 
        select new { 
         value = item.Id, 
         //votes = item.Votes, 
         title = item.Title 
        }).ToList(), 
       JsonRequestBehavior.AllowGet); 
} 

它使用SqlFunctions.StringConvert能在整數的比較使用LIKE。此外,它返回valuetitle屬性的對象列表。如果要返回具有valuelable屬性的對象,則lable屬性中的值將顯示在自動完成上下文菜單中,並且相應的value屬性將被插入到輸入字段中。我們使用自定義title屬性。

客戶端的代碼是

searchoptions: { 
    dataInit: function (elem) { 
     $(elem).autocomplete({ source: '<%= Url.Action("GetTitleAutocomplete") %>' }); 
    } 
} 

爲標準渲染和

searchoptions: { 
    sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge'], 
    dataInit: function (elem) { 
     // it demonstrates custom item rendering 
     $(elem).autocomplete({ source: '<%= Url.Action("GetIds") %>' }) 
      .data("autocomplete")._renderItem = function (ul, item) { 
       return $("<li></li>") 
        .data("item.autocomplete", item) 
        .append("<a><span style='display:inline-block;width:60px;'><b>" + 
         item.value + "</b></span>" + item.title + "</a>") 
        .appendTo(ul); 
      }; 
    } 
} 

爲定製呈現。

此外,我用一些CSS設置:

.ui-autocomplete { 
    /* for IE6 which not support max-height it can be width: 350px; */ 
    max-height: 300px; 
    overflow-y: auto; 
    /* prevent horizontal scrollbar */ 
    overflow-x: hidden; 
    /* add padding to account for vertical scrollbar */ 
    padding-right: 20px; 
} 
/*.ui-autocomplete.ui-menu { opacity: 0.9; }*/ 
.ui-autocomplete.ui-menu .ui-menu-item { font-size: 0.75em; } 
.ui-autocomplete.ui-menu a.ui-state-hover { border-color: Tomato } 
.ui-resizable-handle { 
    z-index: inherit !important; 
} 

,如果你想在自動完成上下文菜單中的一些小 不透明的效果,您可以取消.ui-autocomplete.ui-menu { opacity: 0.9; }設置。

+0

@Timsen:對不起,你應該使用'ToList()'或'ToArray的()'我忘了在開始時包括。 – Oleg

+0

現在動作被調用每次我試圖寫在該領域的東西,但我的列表中仍然犯規顯示了 – Timsen

+0

更新代碼 – Timsen