Если вы попытаетесь решить проблему только для jqGrid, вы можете выбрать другой способ.
Вы можете использовать dataUrl и buildSelect свойства editoptions или searchoptions вместо value
свойство.Эти функции введены специально для использования в AJAX. dataUrl определяет предоставленные URL-адреса в форме, подобной
<select><option value="1">One</option> <option value="2">Two</option></select>
Если вам проще вернуть результаты JSON с сервера, ваша пользовательская функция buildSelect поможет.В качестве параметра он получает данные, отправленные с сервера, и должен вернуть строку <select><option>...</option></select>
.Таким образом, вы достигнете лучших результатов.
Если вы все-таки решите остаться на прежнем уровне, вы должны по крайней мере исправить свой код так, чтобы он следовал
foreach (var q in query)
{
if (sb.Length != 0)
sb.Append(';');
sb.Append(q.Destination); // instead of sb.Append("ID");
sb.Append(':');
sb.Append(q.Destination);
}
, чтобы иметь "FedEx:FedEx;InTime:InTime;TNT:TNT"
вместо"ID:FedEx; ID:InTime; ID:TNT; "
.
ОБНОВЛЕНО : Вы попросили небольшой пример.Допустим, вы можете, например, получить все различные значения строк назначения как List<string>
, а имя этого метода - GetAllDestinations
.Тогда ваше действие, используемое dataUrl , может выглядеть как
public JsonResult GetDestinationList() {
List<string> allDestinations = GetAllDestinations();
Json(allDestinations, JsonRequestBehavior.AllowGet);
}
Чтобы использовать это действие внутри editoptions или searchoptions jqGrid, которые вы можете определитьо следующих
{ name: 'destinations', ditable: true, edittype:'select',
editoptions: { dataUrl:'<%= Url.Action("GetDestinationList","Home") %>',
buildSelect: function(data) {
var response = jQuery.parseJSON(data.responseText);
var s = '<select>';
if (response && response.length) {
for (var i = 0, l=response.length; i<l ; i++) {
var ri = response[i];
s += '<option value="'+ri+'">'+ri+'</option>';
}
}
return s + "</select>";
}
}
}
Если вы не хотите иметь действия, которые будут использоваться для HTTP GET, вы можете использовать Json(allDestinations);
вместо Json(allDestinations, JsonRequestBehavior.AllowGet);
в действии GetDestinationList
, но добавить в список jqGridопции дополнительная опция
ajaxSelectOptions: { type: "POST" }
ОБНОВЛЕНО 2 : Ответ уже старый.Тем временем код jqGrid, где будет вызываться buildSelect
, был изменен.Теперь buildSelect
будет использоваться внутри обработчика success
jQuery.ajax
(см. здесь ) вместо обработчика complete
ранее (см. сообщение и пост например).Поэтому в текущей версии jqGrid строка
var response = jQuery.parseJSON(data.responseText);
не нужна.data
- это обычно анализируемые данные JSON, поэтому строки
buildSelect: function(data) {
var response = jQuery.parseJSON(data.responseText);
в приведенном выше коде можно заменить на
buildSelect: function(response) {