Думаю, будет лучше, если вы используете dataUrl
свойство editoptions вместо использования value
.В этом случае вам не нужно будет использовать синхронный вызов Ajax внутри onSelectRow
, чтобы получить данные выбора вручную.Если данные понадобятся, соответствующий вызов выполнит для вас jqGrid.
URL-адрес из dataUrl
должен возвращать фрагмент HTML для элемента <select>
, включая все <options>
.Таким образом, вы можете преобразовать любой другой ответ из dataUrl
в требуемый формат, реализуя соответствующую функцию обратного вызова buildSelect
.
На вашем месте я бы предпочел возвращать данные JSON из URL-адреса 'MyWebService.asmx / GetOwners'вместо XML-данных, которые вы в настоящее время делаете.В простейшем случае это может быть веб-метод, подобный
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<string> GetSelectData() {
return new List<string> {
"User1", "User2", "User3", "User4"
};
}
. Если вы будете использовать HTTP GET вместо HTTP POST, вам следует запретить использование данных из кэша, установив Cache-Control: private, max-age=0
в заголовке HTTP.соответствующий код будет
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public List<string> GetSelectData() {
HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan(0));
return new List<string> {
"User1", "User2", "User3", "User4"
};
}
По умолчанию jqGrid использует dataType: "html"
в соответствующем вызове Ajax (см. исходный код ).Чтобы изменить поведение на dataType: "json", contentType: "application/json"
, вы должны дополнительно использовать параметр ajaxSelectOptions
в jqGrid как
ajaxSelectOptions: { contentType: "application/json", dataType: 'json' },
или как
ajaxSelectOptions: {
contentType: "application/json",
dataType: 'json',
type: "POST"
},
, если вы будете использовать HTTP POST, который используется по умолчанию дляВеб-сервисы ASMX.
Соответствующая настройка для столбца в colModel
будет
edittype: 'select', editable: true,
editoptions: {
dataUrl: '/MyWebService.asmx/GetSelectData',
buildSelect: buildSelectFromJson
}
, где
var buildSelectFromJson = function (data) {
var html = '<select>', d = data.d, length = d.length, i = 0, item;
for (; i < length; i++) {
item = d[i];
html += '<option value=' + item + '>' + item + '</option>';
}
html += '</select>';
return html;
};
Будьте осторожны, чтобы приведенный выше код использовал data.d
, что требуется в случае веб-сервисов ASMX.Если вы мигрируете в ASP.NET MVC или в WCF, вам нужно будет удалить использование свойства d
и использовать data
напрямую.
ОБНОВЛЕНО : Здесь Вы можете скачать демонстрационный проект VS2010, который реализует то, что я написал выше.