SmartClient ListGrid无数据返回:.aspx与VB.NET交互异常排查
问题排查与修正方案
核心错误点
VB.NET代码笔误
你在添加DataTable到DataSet时,错误使用了未定义的dtChgs变量,实际应该用创建好的dtNames,导致输出的XML为空。XML节点不匹配
前端配置的recordXPath: "/NewDataSet/DATA"要求返回的XML中每行数据节点为<DATA>,但默认DataTable生成的XML节点是<Table>,两者不匹配,前端无法解析数据。前端回调写法错误
fetchData的第二个参数应为函数而非字符串,且绑定DataSource后无需手动调用setData,框架会自动加载数据。空值判断逻辑缺陷
NameList.Count获取的是字符串长度,若输入仅为逗号(如,),会误判为有效输入,应改为判断字符串是否为空或数组长度是否大于0。
修正后的代码
VB.NET(ShowAnimalsList.aspx)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim NameList As String = Request("Names") ' 先判断输入是否为空 If String.IsNullOrEmpty(NameList) Then Return Dim Names As String() = NameList.Split(New Char() {","c}) Dim cTypes As New TypeLib.clsTypes Dim Desc As String Dim dsNames As New DataSet Dim dtNames As New DataTable ' 设置TableName,匹配前端的recordXPath dtNames.TableName = "DATA" dtNames.Columns.Add("AnimalName") dtNames.Columns.Add("Desc") Try For Each Nme As String In Names If String.IsNullOrEmpty(Nme.Trim) Then Continue For Nme = Nme.Trim Desc = cTypes.GetAnimDesc(clsUtility.ConStr, Nme) Dim row As DataRow = dtNames.NewRow() row("AnimalName") = Nme row("Desc") = Desc dtNames.Rows.Add(row) Next ' 修正笔误,添加正确的DataTable dsNames.Tables.Add(dtNames) ' 指定响应内容类型为XML Response.ContentType = "text/xml" dsNames.WriteXml(Response.OutputStream) Catch ex As Exception ' 建议添加错误日志便于排查 ' System.Diagnostics.Debug.WriteLine(ex.ToString()) End Try End Sub
前端JS代码
数据源(无需修改,确保recordXPath匹配)
var dataAnimNames = isc.DataSource.create({ dataURL: "DataScripts/ShowAnimalsList.aspx", recordXPath: "/NewDataSet/DATA", fields: [ { name: "AnimalName", type: "text", title: "Name" }, { name: "Desc", type: "text", title: "Description" } ], });
加载函数(简化写法)
function LoadAnimDesc() { // 直接传递参数,框架自动将数据加载到绑定的Grid AnimalsGrid.fetchData({ Names: Form1.getValue("sNames") }); };
ListGrid(无需修改)
var AnimalsGrid = isc.ListGrid.create({ autoFetchData: false, dataSource: dataAnimNames, width: "80%", });
验证步骤
- 在浏览器开发者工具的网络面板中,查看
ShowAnimalsList.aspx的返回XML,确认结构为:<NewDataSet> <DATA> <AnimalName>Mickey</AnimalName> <Desc>Mouse</Desc> </DATA> <DATA> <AnimalName>Goofy</AnimalName> <Desc>Dog</Desc> </DATA> </NewDataSet> - 确认请求参数
Names已正确传递到后端。
内容的提问来源于stack exchange,提问作者Gerald Hendrix
相关产品推荐
相关产品推荐

