我已经构建了几个成功将我的.NET类型序列化为JSON的Web服务。但是,我遇到了一个问题,即让JSON与YUI库和DataTable完全兼容。
可以使用JSON对象完全配置YUI DataTable。我在.NET中创建了以下结构来表示给定的YUI列定义:
public struct YuiColumnDefinition{
public string key;
public string label;
public bool sortable;
public string formatter;
}
'formatter'属性是指示YUI表在显示给定列时使用自定义javascript函数的方式。问题是,由于格式化程序被定义为String,因此ASP.NET在序列化时将其值包含在双引号中,并且YUI不再将该值识别为JavaScript令牌:
JSON YUI期待
[
{key:"1", label:"Order Date", formatter:myCustomJavaScriptFunction, sortable:true},
{key:"2", label:"Customer Name", formatter:null, sortable:false}
]
JSON ASP.NET创建
[
{key:"1", label:"Order Date", formatter:"myCustomJavaScriptFunction", sortable:true},
{key:"2", label:"Customer Name", formatter:null, sortable:false}
]
任何人都有修改YUI源代码的解决方案吗?
由于
答案 0 :(得分:3)
更改您的解析代码。
将json视为xml的替代品,你不会在xml中放入变量/函数。在其中之一中,您可以轻松识别要使用的格式化程序的名称或类型(例如,从列表或枚举中)。然后你的解析代码会知道它应该将变量/方法指定为“formatter”属性。
在回调中返回实际变量/函数是错误的。你可以使它工作但老实说它不是要走的路。
我会做以下事情......
将您的返回json更改为此。
[
{key:"1", label:"Order Date", formatterName:"myCustomJavaScriptFunction", sortable:true},
{key:"2", label:"Customer Name", formatterName:null, sortable:false}
]
然后在JS中,我们假设json存储在变量returnedObj
function augmentReturnedObject(returnedObj)
{
// validate that returnObj.formatterName (as a variable) is not undefined
var isValidObj = (window[returnedObj.formatterName] !== undefined);
if (isValidObj)
{
// this will return the actual function / variable, here we are assigning it to returnedObj.formatter
returnedObj.formatter = window[returnedObj.formatterName];
}
else
{
returnedObj.formatter = null;
}
}
你可以毫不费力地将其降低到这个水平
function augmentReturnedObject(returnedObj)
{
var specifiedMethod = window[returnedObj.formatterName];
returnedObj.formatter = (specifiedMethod === undefined) ? null : window[returnedObj.formatterName];
}
所以最后你要拿走你的json对象,并做augmentReturnedObject(returnedObj);
,此时你可以将returnedObj
传递给YUI
答案 1 :(得分:0)
正如艾伦正确指出的那样:
在回调中返回实际变量/函数是错误的。
仍然,我在YUI文档中找不到任何地方说明如何处理从JSON或XML返回的javascript函数。
谢天谢地。正如在this中指出的那样,注册自定义javascript格式化函数的“正确”方法是使用YAHOO.widget.DataTable.Formatter:
从.ASMX
返回的JSON列定义[
{key:"1", label:"Order Date", formatter:"myCustomJavaScriptFunction1", sortable:true},
{key:"2", label:"Customer Name", formatter:null, sortable:false}
{key:"3", label:"State", formatter:"myCustomJavaScriptFunction2", sortable:false}
]
Javscript连接YUI DataTable
YAHOO.widget.DataTable.Formatter.myCustomJavaScriptFunction1= this.myCustomJavaScriptFunction1;
YAHOO.widget.DataTable.Formatter.myCustomJavaScriptFunction2= this.myCustomJavaScriptFunction2;
function myCustomJavaScriptFunction1(elCell, oRecord, oColumn, oData) {
//do something
}
function myCustomJavaScriptFunction2(elCell, oRecord, oColumn, oData){
//do something
}