在我的应用程序中,我使用JQGrid来加载一些联系人数据,当我编辑/添加一个条目时,我从数据库中选择联系人的名字,然后更新/添加联系人.
我的问题是,当我单击提交按钮时,我想刷新下拉列表以及已经从下拉列表中输入的数据.
我的代码:
对于colModel:
{ name: 'OwnerEmail', index: 'OwnerEmail', width: 200, align: "center", sortable: true, sorttype: 'text', editable: true, edittype: 'select', editrules: { required: true }, editoptions: { value: ownersList} },
Run Code Online (Sandbox Code Playgroud)
我填充选择行的下拉列表(当我选择一行时,下拉列表将被刷新)
onSelectRow: function (id) {
var advOwners = $.ajax({
type: 'POST',
data: {},
url: 'MyWebService.asmx/GetOwners',
async: false,
error: function () {
alert('An error has occured retrieving Owners!');
}
}).responseXML;
var aux = advOwners.getElementsByTagName("string");
ownersList = "";
for (var i = 0; i < aux.length; i++) {
ownersList += aux[i].childNodes[0].nodeValue + ':' + aux[i].childNodes[0].nodeValue + '; ';
}
ownersList = ownersList.substring(0, ownersList.length - 2);
jQuery("#GridView").setColProp('OwnerEmail', { editoptions: { value: ownersList} });
}
Run Code Online (Sandbox Code Playgroud)
但是当我再次进入编辑/添加表单时,下拉列表没有刷新,它具有首先加载的项目.
有帮助吗?
谢谢,杰夫
我认为这将是更好,如果你使用dataUrl的财产editoptions,而不是使用value属性.在这种情况下,您不需要在其中使用同步Ajax调用onSelectRow来手动获取选择数据.如果需要数据,相应的调用将为您执行jqGrid.
来自的URL dataUrl应返回<select>包含all的元素的HTML片段<options>.因此,您可以将任何其他响应转换dataUrl为实现相应buildSelect回调函数所需的格式.
在您的位置,我更愿意从"MyWebService.asmx/GetOwners"URL返回JSON数据,而不是您当前所做的XML数据.在最简单的情况下,它可能是web方法
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<string> GetSelectData() {
return new List<string> {
"User1", "User2", "User3", "User4"
};
}
Run Code Online (Sandbox Code Playgroud)
如果您使用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"
};
}
Run Code Online (Sandbox Code Playgroud)
默认情况下jqGrid dataType: "html"在相应的Ajax调用中使用(参见源代码).要改变行为,dataType: "json", contentType: "application/json"你应该另外使用ajaxSelectOptionsjqGrid 的参数
ajaxSelectOptions: { contentType: "application/json", dataType: 'json' },
Run Code Online (Sandbox Code Playgroud)
或者作为
ajaxSelectOptions: {
contentType: "application/json",
dataType: 'json',
type: "POST"
},
Run Code Online (Sandbox Code Playgroud)
如果您将使用HTTP POST,这是ASMX Web服务的默认设置.
在该列中的相应设置colModel将
edittype: 'select', editable: true,
editoptions: {
dataUrl: '/MyWebService.asmx/GetSelectData',
buildSelect: buildSelectFromJson
}
Run Code Online (Sandbox Code Playgroud)
哪里
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;
};
Run Code Online (Sandbox Code Playgroud)
请注意上述代码使用data.dASMX Web服务所需的代码.如果要迁移到ASP.NET MVC或WCF,则需要删除d属性的使用并data直接使用.
更新:在这里你可以下载VS2010演示项目,它实现了我上面写的内容.
| 归档时间: |
|
| 查看次数: |
7365 次 |
| 最近记录: |